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".
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.
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)
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.
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.
Avant d’ajouter une clé étrangère à la table, procédez comme suit:
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
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.
Nettoyez vos données de vos tables et établissez une relation entre elles.
Essayez DELETE
les données actuelles de tblDomare.PersNR
. Parce que les valeurs dans tblDomare.PersNR
ne correspond à aucune des valeurs dans tblBana.BanNR
.
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
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é.
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.
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);
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!
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.