web-dev-qa-db-fra.com

L'instruction ALTER TABLE est en conflit avec la contrainte FOREIGN KEY

J'ai un problème en essayant d'ajouter une clé étrangère à ma table tblDomare; qu'est-ce que je fais mal ici?

CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,'Josefin','Backman',4);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,'Johanna','Backman',1);

CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));

INSERT INTO tblBana (BanNR)
Values (1);

INSERT INTO tblBana (BanNR)
Values (2);

INSERT INTO tblBana (BanNR)
Values (3);

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

Message d'erreur:

L'instruction ALTER TABLE est en conflit avec la contrainte FOREIGN KEY "FK _tblDomare _ PersN__5F7E2DAC". Le conflit s'est produit dans la base de données "almu0004", table "dbo.tblBana", colonne "BanNR".

157
user3162932

Cela est dû au fait que vous avez essayé de créer une clé étrangère de tblDomare.PersNR à tblBana.BanNR mais/et que les valeurs de tblDomare.PersNR ne correspondent à aucune des valeurs de tblBana.BanNR. Vous ne pouvez pas créer une relation qui viole l’intégrité référentielle.

295
Smutje

Cette requête m'a été très utile. Il montre toutes les valeurs qui n'ont aucune correspondance

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
30
dantey89

Il est possible de créer la clé étrangère en utilisant ALTER TABLE nom_table AVEC NOCHECK ..., qui autorisera les données qui enfreignent la clé étrangère.

Option "ALTER TABLE nom de table avec NOCHECK ..." pour ajouter le FK - Cette solution a fonctionné pour moi.

26
Ankita Biswas

Essayez cette solution:

Il existe un élément de données dans votre table dont la valeur associée n'existe pas dans la table que vous souhaitez utiliser comme table de clé primaire. Rendez votre table vide ou ajoutez la valeur associée à la seconde table.

23
PatsonLeaner

Avant d’ajouter une clé étrangère à la table, procédez comme suit:

  1. Assurez-vous que la table doit être vide ou que les données de colonne doivent correspondre.
  2. Assurez-vous que ce n'est pas nul.
  3. Si la table contient ne passez pas à la conception et la modification, faites-le manuellement.

    alter table La table 1 ajoute les références de clé étrangère (nom de colonne). La table 2 (nom de colonne).

    alter table Table 1 alter column Nom de colonne attribut non null

10
GirishBabuC

Je suppose qu'une valeur de colonne dans une table de clé étrangère doit correspondre à la valeur de colonne de la table de clé primaire. Si nous essayons de créer une contrainte de clé étrangère entre deux tables dont la valeur dans une colonne (la clé étrangère) est différente de la valeur de colonne de la table de clé primaire, le message sera renvoyé.

Il est donc toujours recommandé d'insérer uniquement les valeurs de la colonne Clé étrangère présentes dans la colonne Table de la clé primaire.

Par ex. Si la colonne de la table principale contient les valeurs 1, 2, 3 et que les valeurs insérées dans la colonne Clé étrangère sont différentes, la requête ne sera pas exécutée car elle s'attend à ce que les valeurs soient comprises entre 1 et 3.

9
sam05

Nettoyez vos données de vos tables et établissez une relation entre elles.

6
max

Essayez DELETE les données actuelles de tblDomare.PersNR. Parce que les valeurs dans tblDomare.PersNR ne correspond à aucune des valeurs dans tblBana.BanNR.

5
Thinker Bell

j’ai eu cette erreur aussi, comme le dit Smutje, assurez-vous que vous n’avez pas de valeur dans la colonne de clé étrangère de votre table de clé étrangère de base qui n’appartient pas à votre table de référence, c’est-à-dire clé étrangère) doit également figurer dans la colonne de votre table de référence) son bon pour vider votre table de clé étrangère de base en premier

3
ako

Smutje a raison et Chad HedgeCock a donné l'exemple d'un grand profane. J'aimerais construire sur l'exemple de Chad en offrant un moyen de trouver/supprimer ces enregistrements. Nous utiliserons le client en tant que parent et la commande en tant qu'enfant. CustomerId est le champ commun.

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

si vous lisez ce fil ... vous obtiendrez des résultats. Ce sont des enfants orphelins. select * from Order Child a rejoint le parent client sur Child.CustomerId = Parent.CustomerId où Parent.CustomerId est null. Notez le nombre de lignes en bas à droite.

Allez vérifier avec qui vous avez besoin que vous allez supprimer ces lignes!

begin tran 
delete Order
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

Exécutez le premier bit. Vérifiez que le nombre de lignes = ce que vous attendiez

commettre le tran

commit tran 

Faites attention. La programmation bâclée de quelqu'un vous a mis dans ce pétrin. Assurez-vous de bien comprendre le pourquoi avant de supprimer les orphelins. Peut-être que le parent doit être restauré.

2
greg

Vous devriez voir si vos tables contiennent des données sur les lignes. Si "oui" alors vous devriez tronquer la ou les table (s) ou vous pouvez leur donner le même nombre de données à tblDomare.PersNR à tblBana.BanNR et vice-versa.

2
adrianex03

les données que vous avez entrées dans une table (tbldomare) ne correspondent pas à des données que vous avez affectées à une table à clé primaire. écrivez entre tbldomare et ajoutez ce mot (avec nocheck), puis exécutez votre code.

par exemple, vous avez entré une table tbldomar ces données

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

et vous avez assigné une table foreign key à n'accepter que 1,2,3.

vous avez deux solutions, l'une consiste à supprimer les données que vous avez entrées dans une table, puis à exécuter le code. un autre est d'écrire ce mot (avec nocheck) le mettre entre le nom de votre table et ajouter comme ceci

ALTER TABLE  tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
2
khadar

Cela m’arrive, puisque je conçois ma base de données, je remarque que je modifie ma valeur de départ sur ma table principale. À présent, la table relationnelle n’a pas de clé étrangère sur la table principale.

J'ai donc besoin de tronquer les deux tables, et cela fonctionne maintenant!

2
Willy David Jr

Dans mon scénario, en utilisant EF, en essayant de créer cette nouvelle clé étrangère sur des données existantes, j’essayais à tort de renseigner les données (création de liens) APRÈS la création de la clé étrangère.

Le correctif consiste à renseigner vos données avant de créer la clé étrangère, car elle les vérifie toutes pour voir si les liens sont effectivement valides. Donc, cela ne pourrait pas fonctionner si vous ne l'avez pas encore rempli.

0
JeromeJ