Istruzione INSERT in conflitto con il vincolo FOREIGN KEY - SQL Server


225

Ricevo il seguente errore. Per favore potete aiutarmi?

Messaggio 547, livello 16, stato 0, riga 1
L'istruzione INSERT è in conflitto con il vincolo FOREIGN KEY "FK_Sup_Item_Sup_Item_Cat". Il conflitto si è verificato nel database "dev_bo", tabella "dbo.Sup_Item_Cat". La dichiarazione è stata chiusa.

Codice:

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

L'ultima colonna client_idsta causando l'errore. Ho provato a mettere il valore che esiste già nella dbo.Sup_Item_Catcolonna, corrispondente al sup_item .. ma nessuna gioia :-(


20
Hai provato a inserire un record nella tabella degli articoli che non ha un record di categoria corrispondente nella Sup_Item_Cattabella. Non c'è molto altro da dire al riguardo.
Martin Smith,

1
Quindi stai dicendo che SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'restituisce risultati?
Martin Smith,

2
Inoltre dici "l'ultimo coulum" client_id "sto ottenendo il conflitto". Questo non è ciò che suggerisce il messaggio di errore, penso che tu stia cercando il posto sbagliato per il tuo problema.
Martin Smith,

Risposte:


287

Nella tua tabella dbo.Sup_Item_Cat, ha un riferimento di chiave esterna a un'altra tabella. Il modo in cui funziona un FK è che non può avere un valore in quella colonna che non sia anche nella colonna chiave primaria della tabella referenziata.

Se si dispone di SQL Server Management Studio, aprirlo e sp_help' dbo.Sup_Item_Cat'. Vedi su quale colonna si trova FK e su quale colonna di quale tabella fa riferimento. Stai inserendo alcuni dati errati.

Fammi sapere se hai bisogno di qualcosa spiegato meglio!


10
Grazie per aver incluso il comando sp_help! Mi ha aiutato a restringere il mio problema simile.
Gaʀʀʏ

In effetti - nel mio caso, la proprietà non veniva semplicemente restituita dalla vista al controller, quindi era sempre 0 (che non era un ID valido, ma il controller non avrebbe modo di saperlo.)
neminem

1
Alt + F1 è scorciatoia per sp_help, per i lettori futrure, selezionare la tabella e premere alt + f1
satsvelke

133

Ho avuto questo problema da solo, per quanto riguarda il messaggio di errore che si riceve cercando di popolare un campo chiave esterna. Sono finito su questa pagina nella speranza di trovare la risposta. La risposta verificata in questa pagina è davvero quella corretta, purtroppo ritengo che la risposta sia un po 'incompleta per le persone che non hanno familiarità con SQL. Sono abbastanza adatto a scrivere codice, ma le query SQL sono nuove per me e la creazione di tabelle di database.

Nonostante la risposta selezionata sia corretta:

Mike M ha scritto-

"Il modo in cui funziona un FK è che non può avere un valore in quella colonna che non sia anche nella colonna chiave primaria della tabella referenziata."

Ciò che manca a questa risposta è semplicemente;

È necessario creare prima la tabella contenente la chiave primaria.

Un altro modo di dirlo è;

È necessario inserire i dati nella tabella padre, contenente la chiave primaria, prima di tentare di inserire i dati nella tabella figlio contenente la chiave esterna.

In breve, molte delle esercitazioni sembrano dare un'occhiata a questo fatto in modo che se dovessi provare da solo e non ti rendessi conto che c'era un ordine di operazioni, otterrai questo errore. Naturalmente dopo aver aggiunto i dati della chiave primaria, i dati della chiave esterna nella tabella figlio devono essere conformi al campo della chiave primaria nella tabella padre, altrimenti si otterrà comunque questo errore.

Se qualcuno ha letto così lontano. Spero che ciò abbia contribuito a rendere più chiara la risposta selezionata. So che alcuni di voi potrebbero pensare che questo genere di cose sia piuttosto semplice e che l'apertura di un libro avrebbe risposto a questa domanda prima che fosse pubblicata, ma la verità è che non tutti imparano allo stesso modo.


E vorrei aggiungere, assicurati di profilare la tua query in quanto non sempre invia ciò che pensi dovrebbe essere al database.
HLGEM,

20

Stai tentando di inserire un record con un valore nella colonna chiave esterna che non esiste nella tabella esterna.

Ad esempio: se si dispone di tabelle Libri e autori in cui Libri ha un vincolo di chiave esterna nella tabella Autori e si tenta di inserire un record libro per il quale non esiste un record autore.


16

Dovrai pubblicare la tua dichiarazione per ulteriori chiarimenti. Ma...

Questo errore indica che la tabella in cui si stanno inserendo i dati ha una relazione di chiave esterna con un'altra tabella. Prima di poter inserire i dati, il valore nel campo chiave esterna deve esistere prima nell'altra tabella.


5

Il problema non è con client_id da quello che posso vedere. Sembra più che il problema sia con la quarta colonna, sup_item_cat_id

Vorrei correre

sp_helpconstraint sup_item

e presta attenzione alla colonna Vincolo_chiavi restituita per la chiave esterna FK_Sup_Item_Sup_Item_Cat per confermare quale colonna è il problema reale, ma sono abbastanza sicuro che non è quello che stai cercando di risolvere. Inoltre "123123" sembra anche sospetto.


5

Qualcosa che ho scoperto è che tutti i campi devono corrispondere ESATTAMENTE.

Ad esempio, l'invio di "cane gatto" non equivale all'invio di "cane gatto".

Quello che ho fatto per risolvere questo problema è stato lo scripting del codice FK dalla tabella in cui stavo inserendo i dati, prendere nota della "Chiave esterna" che aveva i vincoli (nel mio caso c'erano 2) e assicurarsi che quei 2 campi corrispondessero ai valori ESATTAMENTE come erano nella tabella che generava l'errore di vincolo FK.

Una volta risolti i 2 campi dando i miei problemi, la vita era bella!

Se hai bisogno di una spiegazione migliore, fammi sapere.


Questo mi ha davvero aiutato ahah! Trascurato questo fatto, risolto un problema che avevo! Grazie
Johnathan Brown

4

Ho anche ricevuto lo stesso errore nel mio codice SQL, questa soluzione funziona per me,


Controlla i dati nella tabella primaria Potrebbe essere che stai inserendo un valore di colonna che non è presente nella colonna chiave primaria.


3

Significa esattamente ciò che dice. Stai cercando di inserire un valore in una colonna che ha un vincolo FK su di esso che non corrisponde a nessun valore nella tabella di ricerca.


2

Ricontrolla i campi nella relazione per cui è definita la chiave esterna. SQL Server Management Studio potrebbe non avere i campi desiderati selezionati durante la definizione della relazione. Questo mi ha bruciato in passato.


2
  1. eseguire sp_helpconstraint
  2. presta ATTENZIONE alla colonna vincolo_keys restituita per la chiave esterna

2

I dati mancanti nella tabella padre causano il problema. Nel tuo problema la non disponibilità dei dati in "dbo.Sup_Item_Cat" causa il problema


1

Ho avuto lo stesso problema quando ho usato le migrazioni in codice per creare il mio database per un'applicazione MVC 5. Alla fine ho trovato il problema con il metodo seed nel mio file configuration.cs. Il mio metodo seed stava creando una voce di tabella per la tabella contenente la chiave esterna prima di creare la voce con la chiave primaria corrispondente.


1

Ho riscontrato questo problema quando i miei campi del valore di inserimento contenevano schede e spazi che non erano evidenti a occhio nudo. Avevo creato il mio elenco di valori in Excel, copiato e incollato su SQL ed eseguito query per trovare non corrispondenze nei miei campi FK.

Le query di corrispondenza non hanno rilevato la presenza di tabulazioni e spazi nel mio campo FK, ma INSERT li ha riconosciuti e ha continuato a generare l'errore.

Ho provato di nuovo copiando il contenuto del campo FK in un record e incollandolo nella query di inserimento. Quando anche quel disco ha fallito, ho guardato più da vicino i dati e finalmente ho rilevato le schede / gli spazi.

Dopo aver pulito le schede / gli spazi rimossi, il mio problema è stato risolto. Spero che questo aiuti qualcuno!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.