J'ai deux tables avec des données en eux. Nous avions besoin de certaines restructurations, maintenant je dois append une contrainte de key étrangère sur une table qui fait reference à une key composite d'une autre table. Ce sont les définitions de la table Table ABC
CREATE TABLE ABC( ID [int] NOT NULL, ChangeNo [int] NOT NULL, ... UserID [varchar](10) NOT NULL, CONSTRAINT PK_ABC PRIMARY KEY CLUSTERED ( ID,ChangeNo) )
Tableau PQR
CREATE TABLE PQR( ID [int] NOT NULL, UserID [varchar](10) NOT NULL, ... CONSTRAINT PK_PQR PRIMARY KEY CLUSTERED ( ID,UserID) )
Pour append une key étrangère, j'utilise la requête suivante
ALTER TABLE ABC ADD CONSTRAINT FK_ABC_PQR FOREIGN KEY (UserID,ID) REFERENCES PQR(UserID,ID)
Mais en faisant cela, je reçois erreur suivante.
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_ABC_PQR". The conflict occured in database "MyDatabase", table PQR.
Je cherchais sur le net et j'ai appris que avant d'append une key étrangère, je devrais vérifier qu'il n'y a pas de différence de données entre les colonnes respectives des deux tables. Je l'ai vérifié en utilisant la command suivante.
SELECT DISTINCT ID,UserID FROM ABC WHERE ID NOT IN (SELECT DISTINCT ID FROM PQR) AND UserID NOT IN (SELECT DISTINCT UserID FROM PQR)
Et cette requête n'a renvoyé aucun résultat. Cela signifie que toutes datatables dans les colonnes respectives de ABC se trouvent dans ces colonnes respectives de PQR. Mais encore je reçois la même erreur que je l'ai dit ci-dessus, ai-je manqué quelque chose ici? Pourriez-vous me guider s'il vous plaît?
Je vous suggérerais de vérifier datatables en utilisant la requête suivante:
SELECT count([ABC].[id]) FROM [ABC] LEFT JOIN [PQR] ON ([ABC].[UserID] = [PQR].[UserID] AND [ABC].[id] = [PQR].[id]) WHERE [PQR].[id] is null
Et cette requête n'a renvoyé aucun résultat. Cela signifie que toutes datatables dans les colonnes respectives de ABC se trouvent dans ces colonnes respectives de PQR.
Non, cela signifie seulement que pour chaque paire ( userid
, id
) dans ABC
table ABC
, il y a une valeur respective de id
et userid
dans PQR
talbe, mais pas une paire de valeurs respective (ie elles ne peuvent pas être dans une seule ligne)
Par exemple, vous pouvez avoir des paires: (1,2)
+ (2,1)
dans ABC
, et (1,1)
+ (2,2)
dans PQR
et votre requête returnnera 0
lignes. Mais la contrainte de key étrangère échouera.