ERRORE 1452: Impossibile aggiungere o aggiornare una riga figlia: un vincolo di chiave esterna non riesce


132

Ho creato tabelle in MySQL Workbench come mostrato di seguito:

Tabella ORDRE:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

Tabella PRODUKT:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

e tavolo ORDRELINJE:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

quindi quando provo a inserire valori nella ORDRELINJEtabella ottengo:

Codice errore: 1452. Impossibile aggiungere o aggiornare una riga figlia: un vincolo di chiave esterna non riesce ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

Ho visto gli altri post su questo argomento, ma senza fortuna. Sto supervisionando qualcosa o ho idea di cosa fare?


Risposte:


172

Tratto da Using FOREIGN KEY Constraints

Le relazioni di chiave esterna coinvolgono una tabella padre che contiene i valori dei dati centrali e una tabella figlio con valori identici che puntano al suo padre. La clausola FOREIGN KEY è specificata nella tabella figlia.

Rifiuterà qualsiasi operazione INSERT o UPDATE che tenti di creare un valore di chiave esterna in una tabella figlia se non è presente un valore di chiave candidata corrispondente nella tabella padre.

Quindi il tuo errore Error Code: 1452. Cannot add or update a child row: a foreign key constraint failssignifica essenzialmente che stai cercando di aggiungere una riga alla tua Ordrelinjetabella per la quale non è presente alcuna riga corrispondente (OrderID) nella Ordretabella.

Devi prima inserire la riga nella tua Ordretabella.


Oppure possiamo rilasciare la chiave esterna quindi aggiungere la chiave esterna dopo l'inserimento dei dati?
Vamsi Pavan Mahesh,

@VamsiPavanMahesh, NO, perché anche se lo fai; la creazione della tua chiave foriegn fallirà con lo stesso tipo di errore poiché ci sarà una mancata corrispondenza dei dati chiave.
Rahul

4
In parole semplici, se i bambini hanno l'ID genitore definito, questi genitori devono esistere. E ho pensato che la mia sintassi fosse sbagliata ... Mi ha aiutato molto. Grazie!
wst

2
E le relazioni opzionali?
Hamed Hamedi

40

Stai ottenendo questo controllo dei vincoli perché la Ordretabella non ha riferimenti OrdreIDforniti nel comando di inserimento.

Per inserire il valore in Ordrelinje, devi prima inserire il valore nella Ordretabella e utilizzare lo stesso OrdreIDnella Orderlinjetabella.

Oppure puoi rimuovere il vincolo non nullo e inserire un valore NULL in esso.


29

È necessario eliminare i dati nella tabella figlio che non ha alcun valore di chiave esterna corrispondente alla chiave primaria della tabella padre. Oppure eliminare tutti i dati dalla tabella figlio, quindi inserire nuovi dati con lo stesso valore di chiave esterna della chiave primaria nella tabella padre . Dovrebbe funzionare. Qui anche un video di YouTube


1
Questo è corretto, prima di inserire i dati nella tabella pivot (che ha vincoli CASCADE), è necessario inserire i dati nelle tabelle padre. es. 1a tabella - permessi; 2 ° tavolo - ruoli; 3a tabella - permission_role; Quindi il primo inserimento nella tabella delle autorizzazioni, il secondo inserimento nella tabella dei ruoli e infine l'inserimento nella tabella permission_role.
Deepak Panwar

25

Il problema è con il vincolo FOREIGN KEY. Per impostazione predefinita (SET FOREIGN_KEY_CHECKS = 1). L'opzione FOREIGN_KEY_CHECKS specifica se controllare o meno i vincoli di chiave esterna per le tabelle InnoDB. MySQL - SET FOREIGN_KEY_CHECKS

Possiamo impostare il controllo della chiave esterna come disabilitato prima di eseguire Query. Disabilita chiave esterna .

Esegui una di queste righe prima di eseguire la query, quindi puoi eseguire correttamente la query. :)

1) Per sessione (consigliato)

SET FOREIGN_KEY_CHECKS=0;

2) A livello globale

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

Questo errore si verifica generalmente perché abbiamo alcuni valori nel campo di riferimento della tabella figlia, che non esistono nel campo referenziato / candidato della tabella padre.

A volte, possiamo ricevere questo errore quando applichiamo vincoli di chiave esterna a tabelle esistenti, che contengono già dati . Alcune delle altre risposte suggeriscono di eliminare completamente i dati dalla tabella figlia e quindi applicare il vincolo. Tuttavia, questa non è un'opzione quando abbiamo già dati di lavoro / produzione nella tabella figlia. Nella maggior parte degli scenari, avremo bisogno di aggiornare i dati nella tabella figlia (invece di eliminarli).

Ora, possiamo utilizzare Left Joinper trovare tutte quelle righe nella tabella figlia, che non ha valori corrispondenti nella tabella genitore. La seguente query sarebbe utile per recuperare quelle righe non corrispondenti:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Ora, puoi generalmente eseguire uno (o più) dei seguenti passaggi per correggere i dati.

  1. In base alla tua "logica aziendale", dovrai aggiornare / abbinare questi valori non corrispondenti ai valori esistenti nella tabella padre. A volte potresti dover impostare anche loro null.
  2. Elimina queste righe con valori non corrispondenti.
  3. Aggiungi nuove righe nella tabella genitore, corrispondenti ai valori non corrispondenti nella tabella figlia.

Una volta che i dati sono stati corretti, possiamo applicare il vincolo di chiave esterna usando la ALTER TABLEsintassi.


Elimino tutti i dati dalla tabella e poi aggiungo la chiave esterna che è stata aggiunta grazie
Sumit Kumar Gupta

4

nella tabella della chiave esterna ha un valore che non è di proprietà della tabella della chiave primaria che sarà correlata, quindi devi prima eliminare tutti i dati / regolare il valore della tabella della chiave esterna in base al valore che si trova nella tua chiave primaria


3

Stavo riscontrando questo problema anche se la mia tabella genitore aveva tutti i valori a cui facevo riferimento nella mia tabella figlia. Il problema sembrava essere che non potevo aggiungere più riferimenti figlio a una singola chiave esterna. In altre parole, se avevo cinque righe di dati che facevano riferimento alla stessa chiave esterna, MySQL mi consentiva di caricare solo la prima riga e mi dava l'errore 1452.

Quello che ha funzionato per me è stato digitare il codice "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Dopodiché ho chiuso MySQL e poi l'ho riavviato e sono stato in grado di caricare tutti i miei dati senza errori. Ho quindi digitato "SET GLOBAL FOREIGN_KEY_CHECKS = 1" per riportare il sistema alla normalità anche se non sono del tutto sicuro di cosa faccia FOREIGN_KEY_CHECKS. Spero che questo ti aiuti!


Non è proprio quello che è già stato suggerito nella risposta pubblicata da @ Mr-Faizan? In caso contrario, spiega cosa aggiunge la tua risposta.
Adrian Mole

2

Questo può essere risolto inserendo prima i rispettivi record nella tabella Parent e poi possiamo inserire i record nella rispettiva colonna della tabella Child. Controlla anche il tipo di dati e la dimensione della colonna. Dovrebbe essere uguale alla colonna della tabella padre, anche il motore e le regole di confronto dovrebbero essere gli stessi. PROVA QUESTO! Ecco come ho risolto il mio. Correggimi se sbaglio.


1

La tua ORDRELINJEtabella è collegata alla ORDERtabella utilizzando un vincolo di chiave esterna in constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)base a quale Ordre int NOT NULL,colonna della tabella ORDRELINJEdeve corrispondere a qualsiasi Ordre int NOT NULL,colonna della ORDERtabella.

Ora ciò che sta accadendo qui è che, quando si inserisce una nuova riga nella ORDRELINJEtabella, in base al vincolo fk Ordrelinje_fksta controllando la ORDERtabella se OrdreIDè presente o meno e poiché non corrisponde a nessun OrderId, il compilatore si lamenta per la violazione della chiave esterna. Questo è il motivo per cui ricevi questo errore.

La chiave esterna è la chiave primaria dell'altra tabella che usi in qualsiasi tabella per collegare le due. Questa chiave è vincolata dal vincolo di chiave esterna specificato durante la creazione della tabella. Qualsiasi operazione sui dati non deve violare questo vincolo. La violazione di questo vincolo può causare errori come questo.

Spero di averlo chiarito.


1

Durante l'inserimento dei valori dell'attributo della chiave esterna, verificare prima il tipo di attributi, nonché il valore dell'attributo della chiave primaria nella relazione padre, se i valori nella relazione padre corrispondono, quindi è possibile inserire / aggiornare facilmente i valori dell'attributo figlio.


1

dovresti aggiungere i dati da REFERENCES KEY in PRIMARY TABLE a FOREIGN KEY in CHILD TABLE
significa non aggiungere dati casuali alla chiave esterna ، usa solo i dati dalla chiave primaria che è accessibile

descrizione dei dati in chiave esterna


1

Questo mi ha aiutato dopo aver letto le risposte di @ Mr-Faizan e altre.

Deseleziona "Abilita i controlli delle chiavi esterne"

in phpMyAdmin e premi la query. Non so di WorkBench ma le altre risposte potrebbero aiutarti.


0

dovresti inserire almeno un raw in ogni tabella (quelle a cui vuoi puntare le chiavi esterne) quindi puoi inserire o aggiornare i valori delle chiavi esterne


0

malato spremere questo qui: il mio caso stava cercando di creare un mi piace per un post che potrebbe esistere; durante il commit nel database l'errore è stato generato. la soluzione era creare prima il post e poi mettere mi piace. dalla mia comprensione se il post_id doveva essere salvato nella tabella dei Mi piace, doveva prima controllare con la tabella dei post per accertarne l'esistenza. ho trovato meglio averlo in questo modo poiché è più logico per me in questo modo ..


0

Quando utilizzi una chiave esterna , l' ordine delle colonne dovrebbe essere lo stesso per l' inserimento .

Ad esempio, se stai aggiungendo (userid, password)in table1 da table2, l' ordine da table2 dovrebbe essere lo stesso (userid, password)e non come (password,userid) dove useridè la chiave esterna in table2 di table1 .


0

Il problema si verifica perché si imposta la chiave esterna nella tabella figlio dopo aver inserito alcuni dati nella tabella figlio.

Prova a rimuovere tutti i dati dalla tabella figlia, quindi imposta la chiave esterna e successivamente aggiungi / inserisci i dati nella tabella, funzionerà.


0

controllare il no. di record nella tabella padre che corrisponde alla tabella figlia e anche la chiave primaria deve corrispondere al riferimento alla chiave esterna. Questo funziona per me.


-4

Funziona al 100% ...

ERRORE 1452: Impossibile aggiungere o aggiornare una riga figlia: un vincolo di chiave esterna fallisce ... se si verifica questo tipo di errore: quindi prima di tutto vai a questa tabella e controlla le impostazioni> se il motore è: InnoDB quindi cambialo in MyISAM

(ed elimina i riferimenti vincolo esterno)

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.