0

会計ソフトウェアのようなバウチャー入力システムを作成します

しかし、私はエラーメッセージを受け取ります

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.
4

2 に答える 2

1

peterm は正しいです。2 番目の制約では、挿入が通過できません。

私の最初のアイデアは、すべてのバウチャーを含むテーブルを作成し、それを単一の制約で使用することですが、3 番目のテーブルがまさにそのテーブルであることを理解しています。

したがって、最初の 2 つのテーブルにデータを入力するときに、トリガーまたは他の方法を使用してそのテーブルにデータを入力することをお勧めします。

維持する必要がある別のコードであることはわかっていますが、他の可能な回避策 (ビューを使用するか、キーを複製して 2 つのテーブルを参照するなど) は、データ モデルをより複雑にするだけで、利点はほとんどまたはまったくなく、誰が将来的にそれらのテーブルで作業します..

于 2013-03-13T09:52:39.513 に答える
1

外部キーは、1 つの親テーブルのみを参照する必要があります。

あなたの場合、テーブルの同じ列[Voucher_No], [voucher_type]All_Voucher_List2つのテーブル[Receipt_Voucher]とを参照してい[Payment_Voucher]ます。

2 番目の FKにレコードを挿入しようとするとReceipt_Voucher、テーブルに対応するレコードがないため、それができなくなりPayment_Voucherます。

このトピックの詳細については、こちらをご覧ください

于 2013-03-13T08:39:01.953 に答える