与FOREIGN KEY约束冲突

时间:2013-03-13 08:26:22

标签: sql sql-server-2008

我创建了一个像会计软件这样的凭证录入系统

但我收到错误消息

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the FOREIGN KEY constraint "Payment_Voucher_All_Voucher_List". The conflict occurred in database "Accounting12", table "dbo.Payment_Voucher".

The statement has been terminated.

请有人告诉我数据库有什么问题 和数据库架构在这里

CREATE TABLE [dbo].[Receipt_Voucher] (
    [Id] INTEGER IDENTITY(90000000,1) NOT NULL,
    [Voucher_No] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Date] DATE,
    [Dr_Account] INTEGER,
    [Dr_Amount] MONEY,
    [Cr_Account] INTEGER,
    [Cr_Amount] MONEY,
    [voucher_type] VARCHAR(40) NOT NULL,
    CONSTRAINT [PK_Receipt_Voucher] PRIMARY KEY CLUSTERED ([Voucher_No], [voucher_type])
)
GO


/* ---------------------------------------------------------------------- */
/* Add table "Payment_Voucher"                                            */
/* ---------------------------------------------------------------------- */

CREATE TABLE [dbo].[Payment_Voucher] (
    [Id] INTEGER IDENTITY(90000000,1) NOT NULL,
    [Voucher_No] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Date] DATE,
    [Dr_Account] INTEGER,
    [Dr_Amount] MONEY,
    [Cr_Account] INTEGER,
    [Cr_Amount] MONEY,
    [voucher_type] VARCHAR(40) NOT NULL,
    CONSTRAINT [PK_Payment_Voucher] PRIMARY KEY CLUSTERED ([Voucher_No], [voucher_type])
)
GO


/* ---------------------------------------------------------------------- */
/* Add table "All_Voucher_List"                                           */
/* ---------------------------------------------------------------------- */

CREATE TABLE [dbo].[All_Voucher_List] (
    [Voucher_No] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [voucher_type] VARCHAR(40) NOT NULL,
    CONSTRAINT [PK_Voucher] PRIMARY KEY CLUSTERED ([Voucher_No], [voucher_type])
)
GO


/* ---------------------------------------------------------------------- */
/* Foreign key constraints                                                */
/* ---------------------------------------------------------------------- */

ALTER TABLE [dbo].[All_Voucher_List] ADD CONSTRAINT [Receipt_Voucher_All_Voucher_List] 
    FOREIGN KEY ([Voucher_No], [voucher_type]) REFERENCES [dbo].[Receipt_Voucher] ([Voucher_No],[voucher_type])
GO


ALTER TABLE [dbo].[All_Voucher_List] ADD CONSTRAINT [Payment_Voucher_All_Voucher_List] 
    FOREIGN KEY ([Voucher_No], [voucher_type]) REFERENCES [dbo].[Payment_Voucher] ([Voucher_No],[voucher_type])
GO

输入收据凭证

INSERT INTO dbo.Receipt_Voucher
        ( Voucher_No ,
          Date ,
          Dr_Account ,
          Dr_Amount ,
          Cr_Account ,
          Cr_Amount ,
          voucher_type
        )
VALUES  ( '0001' , -- Voucher_No - varchar(50)
          '2013-03-13 08:15:28' , -- Date - date
          5 , -- Dr_Account - int
          500 , -- Dr_Amount - money
          2 , -- Cr_Account - int
          500 , -- Cr_Amount - money
          '2'  -- voucher_type - varchar(40)
        )

现在输入All_Voucher_List

INSERT INTO dbo.All_Voucher_List
        ( Voucher_No, voucher_type )
VALUES  ( '0001', -- Voucher_No - varchar(50)
          '2'  -- voucher_type - varchar(40)
          )

但有一些错误

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the FOREIGN KEY constraint "Payment_Voucher_All_Voucher_List". The conflict occurred in database "Accounting12", table "dbo.Payment_Voucher".
The statement has been terminated.

2 个答案:

答案 0 :(得分:1)

外键只能引用一个父表。

在您的情况下,[Voucher_No], [voucher_type]表的相同列All_Voucher_List引用了两个表[Receipt_Voucher][Payment_Voucher]

当您尝试将记录插入Receipt_Voucher时,您的第二个FK会阻止您,因为您在Payment_Voucher表中没有相应的记录。

您可以阅读有关该主题的更多信息here

答案 1 :(得分:1)

peterm是正确的,你的第二个约束不允许插入通过。

我的第一个想法是创建一个包含所有凭证并在单个约束中使用它的表,但我知道你的第三个表就是那个表。

所以我的建议是在填充前两个表时使用触发器或其他方法填充该表。

我知道这是维护的另一段代码,但其他可能的解决方法(比如使用视图或复制键来引用两个表)只会使您的数据模型更加复杂,几乎没有任何好处,并会产生问题将来谁将在这些桌子上工作..