2013-03-13 4 views
0

je crée un système d'entrée de bon comme le logiciel comptableen conflit avec la contrainte FOREIGN KEY

mais je reçois un message d'erreur

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. 

s'il vous plaît me conte de quelqu'un qui ne va pas avec ma base de données
schéma et base de données est ici

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 

entrer dans bon de réception

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) 
     ) 

Programmez dans All_Voucher_List

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

mais il y a quelques erreurs

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. 

Répondre

1

Une clé étrangère doit faire référence à une seule table parent.

Dans votre cas, les mêmes colonnes [Voucher_No], [voucher_type] de All_Voucher_List référence de table deux tables [Receipt_Voucher] et [Payment_Voucher].

Lorsque vous essayez d'insérer un enregistrement dans Receipt_Voucher, votre deuxième FK vous en empêche car vous n'avez pas d'enregistrement correspondant dans la table Payment_Voucher.

Vous pouvez en savoir plus sur ce sujet here

1

peterm est correcte, votre deuxième contrainte ne permet pas l'insertion de passer par.

Ma première idée serait de créer une table qui contient tous les bons et de l'utiliser dans une seule contrainte, mais je comprends que votre troisième table est exactement ce tableau.

Donc, ma suggestion est de remplir cette table en utilisant des déclencheurs ou d'autres méthodes, lorsque vous remplissez les deux premières tables. Je sais que c'est un autre morceau de code à maintenir, mais d'autres solutions possibles (comme utiliser une vue ou dupliquer les clés pour référencer deux tables) rendront votre modèle de données plus compliqué avec peu ou pas d'avantages et créeront problèmes à qui travaillera sur ces tables à l'avenir ..

Questions connexes