Instruction INSERT en conflit avec la contrainte FOREIGN KEY - SQL Server


225

Je reçois l'erreur suivante. Pourrais-tu m'aider s'il te plaît?

Msg 547, niveau 16, état 0, ligne 1
L'instruction INSERT était en conflit avec la contrainte FOREIGN KEY "FK_Sup_Item_Sup_Item_Cat". Le conflit s'est produit dans la base de données "dev_bo", table "dbo.Sup_Item_Cat". La déclaration est terminée.

Code:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

La dernière colonne client_idest à l'origine de l'erreur. J'ai essayé de mettre la valeur qui existe déjà dans le dbo.Sup_Item_Catdans la colonne, correspondant au sup_item .. mais pas de joie :-(


20
Vous avez essayé d'insérer un enregistrement dans votre table d'articles qui n'a pas d'enregistrement de catégorie correspondant dans votre Sup_Item_Cattable. Pas grand chose d'autre à dire à ce sujet.
Martin Smith

1
Vous dites donc que cela SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'donne des résultats?
Martin Smith

2
Vous dites aussi «le dernier coulum» client_id «je reçois le conflit». Ce n'est pas ce que le message d'erreur implique, je pense que vous cherchez au mauvais endroit pour votre problème.
Martin Smith

Réponses:


287

Dans votre table dbo.Sup_Item_Cat, il a une référence de clé étrangère vers une autre table. Le fonctionnement d'un FK est qu'il ne peut pas avoir de valeur dans cette colonne qui ne se trouve pas également dans la colonne de clé primaire de la table référencée.

Si vous avez SQL Server Management Studio, ouvrez-le et sp_help' dbo.Sup_Item_Cat'. Voir à quelle colonne se trouve FK et à quelle colonne de quelle table il fait référence. Vous insérez de mauvaises données.

Faites-moi savoir si vous avez besoin de quelque chose de mieux expliqué!


10
Merci d'avoir inclus la commande sp_help! M'a aidé à réduire mon problème similaire.
Gaʀʀʏ

En effet - dans mon cas, la propriété n'était tout simplement pas renvoyée de la vue au contrôleur, donc c'était toujours 0 (ce qui n'était pas un identifiant valide, mais le contrôleur n'aurait aucun moyen de le savoir.)
neminem

1
Alt + F1 est un raccourci pour sp_help, pour les futurs lecteurs, sélectionnez le tableau et appuyez sur alt + f1
satsvelke

133

J'ai eu ce problème moi-même, concernant le message d'erreur qui est reçu en essayant de remplir un champ de clé étrangère. Je me suis retrouvé sur cette page dans l'espoir de trouver la réponse. La réponse vérifiée sur cette page est en effet la bonne, malheureusement je pense que la réponse est un peu incomplète pour les gens qui ne connaissent pas aussi bien SQL. Je suis assez apte à écrire du code, mais les requêtes SQL sont nouvelles pour moi ainsi que la création de tables de base de données.

Bien que la réponse cochée soit correcte:

Mike M a écrit-

"Le fonctionnement d'un FK est qu'il ne peut pas avoir de valeur dans cette colonne qui ne se trouve pas également dans la colonne de clé primaire de la table référencée."

Ce qui manque à cette réponse est simplement;

Vous devez d'abord créer la table contenant la clé primaire.

Une autre façon de le dire est;

Vous devez insérer des données dans la table parent, contenant la clé primaire, avant de tenter d'insérer des données dans la table enfant contenant la clé étrangère.

En bref, de nombreux didacticiels semblent masquer ce fait, de sorte que si vous essayiez par vous-même et ne réalisiez pas qu'il y avait un ordre de fonctionnement, vous obtiendriez cette erreur. Naturellement, après l'ajout des données de clé primaire, vos données de clé étrangère dans la table enfant doivent être conformes au champ de clé primaire dans la table parent, sinon, vous obtiendrez toujours cette erreur.

Si quelqu'un a lu jusqu'ici. J'espère que cela a aidé à rendre la réponse vérifiée plus claire. Je sais que certains d'entre vous peuvent penser que ce genre de chose est assez simple et qu'ouvrir un livre aurait répondu à cette question avant sa publication, mais la vérité est que tout le monde n'apprend pas de la même manière.


Et je voudrais ajouter, assurez-vous de profiler votre requête car elle n'envoie pas toujours ce que vous pensez qu'elle devrait être à la base de données.
HLGEM

20

Vous essayez d'insérer un enregistrement avec une valeur dans la colonne de clé étrangère qui n'existe pas dans la table étrangère.

Par exemple: si vous avez des tables Livres et Auteurs où Livres a une contrainte de clé étrangère sur la table Auteurs et que vous essayez d'insérer un enregistrement de livre pour lequel il n'y a pas d'enregistrement d'auteur.


16

Vous devrez publier votre déclaration pour plus de précisions. Mais...

Cette erreur signifie que la table dans laquelle vous insérez des données a une relation de clé étrangère avec une autre table. Avant d'insérer des données, la valeur du champ de clé étrangère doit d'abord exister dans l'autre table.


5

Le problème n'est pas avec client_id d'après ce que je peux voir. Cela ressemble plus au problème avec la 4ème colonne, sup_item_cat_id

Je courrais

sp_helpconstraint sup_item

et faites attention à la colonne constraint_keys retournée pour la clé étrangère FK_Sup_Item_Sup_Item_Cat pour confirmer quelle colonne est le problème réel, mais je suis à peu près sûr que ce n'est pas celle que vous essayez de résoudre. Outre «123123», il semble également suspect.


5

J'ai trouvé que tous les champs devaient correspondre EXACTEMENT.

Par exemple, l'envoi de «cat dog» n'est pas la même chose que l'envoi de «catdog».

Ce que j'ai fait pour résoudre ce problème était d'écrire le code FK de la table dans laquelle j'insérais des données, de prendre note de la "clé étrangère" qui avait les contraintes (dans mon cas, il y en avait 2) et de s'assurer que les valeurs de ces 2 champs correspondaient. EXACTEMENT car ils étaient dans le tableau qui lançait l'erreur de contrainte FK.

Une fois que j'ai corrigé les 2 champs donnant mes problèmes, la vie était belle!

Si vous avez besoin d'une meilleure explication, faites-le moi savoir.


Cela m'a vraiment aidé haha! Oublié ce fait, résolu un problème que j'avais! Merci
Johnathan Brown

4

J'ai également eu la même erreur dans mon code SQL, cette solution fonctionne pour moi,


Vérifiez les données dans la table primaire. Il se peut que vous saisissiez une valeur de colonne qui n'est pas présente dans la colonne de clé primaire.


3

Cela signifie exactement ce qu'il dit. Vous essayez d'insérer une valeur dans une colonne qui a une contrainte FK qui ne correspond à aucune valeur de la table de recherche.


2

Vérifiez les champs de la relation pour laquelle la clé étrangère est définie. SQL Server Management Studio n'a peut-être pas eu les champs que vous vouliez sélectionnés lorsque vous avez défini la relation. Cela m'a brûlé dans le passé.


2
  1. exécuter sp_helpconstraint
  2. faites ATTENTION à la colonne constraint_keys retournée pour la clé étrangère

2

Les données de la table parent manquantes provoquent le problème. Dans votre problème, la non disponibilité des données dans "dbo.Sup_Item_Cat" provoque le problème


1

J'ai eu le même problème lorsque j'ai utilisé des migrations en premier code pour créer ma base de données pour une application MVC 5. J'ai finalement trouvé la méthode de départ dans mon fichier configuration.cs à l'origine du problème. Ma méthode de départ créait une entrée de table pour la table contenant la clé étrangère avant de créer l'entrée avec la clé primaire correspondante.


1

J'ai rencontré ce problème lorsque mes champs de valeur d'insertion contenaient des tabulations et des espaces qui n'étaient pas évidents à l'œil nu. J'avais créé ma liste de valeurs dans Excel, copiée et collée dans SQL et exécuté des requêtes pour trouver des non-correspondances sur mes champs FK.

Les requêtes de correspondance n'ont pas détecté la présence d'onglets et d'espaces dans mon champ FK, mais INSERT les a reconnus et a continué à générer l'erreur.

J'ai testé à nouveau en copiant le contenu du champ FK dans un enregistrement et en le collant dans la requête d'insertion. Lorsque cet enregistrement a également échoué, j'ai regardé de plus près les données et j'ai finalement détecté les tabulations / espaces.

Une fois que j'ai nettoyé les onglets / espaces supprimés, mon problème a été résolu. J'espère que cela aide quelqu'un!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.