Ich habe ein seltsames Problem. Ich versuche, einer Tabelle einen Fremdschlüssel hinzuzufügen, der auf eine andere verweist, aber dies schlägt aus irgendeinem Grund fehl. Aufgrund meiner begrenzten Kenntnisse in MySQL kann möglicherweise nur vermutet werden, dass sich in einer anderen Tabelle ein Fremdschlüssel befindet, der auf den Schlüssel verweist, auf den ich verweisen möchte.
Ich habe eine SHOW CREATE TABLE
Abfrage für beide Tabellen durchgeführt, sourcecodes_tags
ist die Tabelle mit dem Fremdschlüssel, sourcecodes
ist die referenzierte Tabelle.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Dies ist der Code, der den Fehler generiert:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
Antworten:
Sehr wahrscheinlich
sourcecodes_tags
enthält Ihre Tabellesourcecode_id
Werte, die in Ihrersourcecodes
Tabelle nicht mehr vorhanden sind . Sie müssen diese zuerst loswerden.Hier ist eine Abfrage, die diese IDs finden kann:
quelle
UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes)
sollte helfen, diese IDs loszuwerden. Wenn diesnull
nicht zulässig istsourcecode_id
, entfernen Sie diese Zeilen oder fügen Sie die fehlenden Werte zursourcecodes
Tabelle hinzu.SELECT Tchild.id FROM Tchild INNER JOIN Tmain ON Tmain.id = Tchild.fk_id WHERE Tmain.id IS NULL
gibt es nichts zurück, also liegt das Problem woanders !?UPDATE `homestead`.`automations` SET `deleted_at`=NULL WHERE deleted_at IS NOT NULL;
, was überhaupt keinen Fremdschlüssel beinhaltete, also war ich verwirrt. Die Tatsache, dass in meiner Kontakttabelle einige Datensätze fehlten, auf die in der Automatisierungstabelle verwiesen wurde, führte dazu, dass dieser "Fehlercode: 1452" ausgelöst wurde. Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl.Ich hatte das gleiche Problem mit meiner MySQL-Datenbank, aber schließlich bekam ich eine Lösung, die für mich funktionierte.
Da in meiner Tabelle aus MySQL-Sicht alles in Ordnung war (beide Tabellen sollten die InnoDB-Engine verwenden und der Datentyp jeder Spalte sollte vom gleichen Typ sein, der an der Fremdschlüsseleinschränkung teilnimmt).
Das einzige, was ich getan habe, war, die Fremdschlüsselprüfung zu deaktivieren und sie später nach dem Ausführen der Fremdschlüsseloperation zu aktivieren.
Schritte, die ich unternommen habe:
quelle
Verwenden Sie
NOT IN
zu finden , wo Einschränkungen werden beschränke :also genauer:
BEARBEITEN:
IN
undNOT IN
Operatoren sind bekanntermaßen viel schneller als dieJOIN
Operatoren sowie viel einfacher zu konstruieren und zu wiederholen.quelle
Schneiden Sie die Tabellen ab und fügen Sie dann die FK-Einschränkung hinzu .
Ich weiß, dass diese Lösung etwas umständlich ist, aber sie funktioniert zu 100%. Aber ich stimme zu, dass dies keine ideale Lösung ist, um Probleme zu lösen, aber ich hoffe, es hilft.
quelle
Für mich war dieses Problem etwas anders und super einfach zu überprüfen und zu lösen.
Sie müssen sicherstellen, dass BEIDE Ihrer Tabellen InnoDB sind. Wenn eine der Tabellen, nämlich die Referenztabelle, ein MyISAM ist, schlägt die Einschränkung fehl.
quelle
Dies geschieht auch, wenn ein Fremdschlüssel für parent.id auf child.column gesetzt wird, wenn die child.column bereits den Wert 0 hat und kein parent.id-Wert 0 ist
Sie müssen sicherstellen, dass jede child.column NULL ist oder einen Wert hat, der in parent.id vorhanden ist
Und jetzt, wo ich die Aussage gelesen habe, die nos geschrieben hat, bestätigt er dies.
quelle
Ich hatte heute das gleiche Problem. Ich habe vier Dinge getestet, von denen einige bereits hier erwähnt wurden:
Gibt es in Ihrer untergeordneten Spalte Werte, die in der übergeordneten Spalte nicht vorhanden sind (außer NULL, wenn die untergeordnete Spalte nullwertfähig ist)?
Haben untergeordnete und übergeordnete Spalten denselben Datentyp?
Gibt es einen Index für die übergeordnete Spalte, auf die Sie verweisen? MySQL scheint dies aus Leistungsgründen zu erfordern ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html ).
Und dieser hat es für mich gelöst: Haben beide Tabellen eine identische Sortierung?
Ich hatte eine Tabelle in UTF-8 und die andere in ISO-Etwas. Das hat nicht funktioniert. Nach dem Ändern der ISO-Tabelle in UTF-8-Kollatierung konnten die Einschränkungen problemlos hinzugefügt werden. In meinem Fall hat phpMyAdmin in der Dropdown-Liste zum Erstellen der Fremdschlüsseleinschränkung nicht einmal die untergeordnete Tabelle in Isokodierung angezeigt.
quelle
Es scheint, dass es einen ungültigen Wert für die Spaltenzeile 0 gibt, der kein gültiger Fremdschlüssel ist, sodass MySQL keine Fremdschlüsseleinschränkung dafür festlegen kann.
Sie können die folgenden Schritte ausführen:
Löschen Sie die Spalte, für die Sie versucht haben, die FK-Einschränkung festzulegen.
Fügen Sie es erneut hinzu und setzen Sie den Standardwert auf NULL.
Versuchen Sie erneut, eine Fremdschlüsseleinschränkung festzulegen.
quelle
Ich hatte das gleiche Problem, ich überprüfte die Zeilen meiner Tabellen und stellte fest, dass es eine gewisse Inkompatibilität mit dem Wert von Feldern gab, für die ich einen Fremdschlüssel definieren wollte. Ich habe diesen Wert korrigiert, es erneut versucht und das Problem wurde gelöst.
quelle
Am Ende lösche ich alle Daten in meiner Tabelle und führe alter erneut aus. Es klappt. Nicht die brillante, aber es spart viel Zeit, insbesondere befindet sich Ihre Anwendung noch in der Entwicklungsphase ohne Kundendaten.
quelle
Versuche dies
quelle
Ich hatte genau das gleiche Problem ungefähr drei verschiedene Male. In jedem Fall lag es daran, dass einer (oder mehrere) meiner Datensätze nicht dem neuen Fremdschlüssel entsprachen. Möglicherweise möchten Sie Ihre vorhandenen Datensätze aktualisieren, um den Syntaxbeschränkungen des Fremdschlüssels zu folgen, bevor Sie versuchen, den Schlüssel selbst hinzuzufügen. Das folgende Beispiel sollte im Allgemeinen die Problemdatensätze isolieren:
Wiederholen Sie
AND (candidate key) <> (next proposed foreign key value)
innerhalb Ihrer Abfrage für jeden Wert im Fremdschlüssel.Wenn Sie eine Menge Datensätze haben, kann dies schwierig sein, aber wenn Ihr Tisch relativ klein ist, sollte es nicht zu lange dauern. Ich bin in der SQL-Syntax nicht besonders beeindruckend, aber das hat das Problem für mich immer isoliert.
quelle
Leeren Sie beide Daten Ihrer Tabellen und führen Sie den Befehl aus. Es wird klappen.
quelle
Ich habe diesen Fehler bei der Verwendung von Laravel und eloquent erhalten. Der Versuch, eine Fremdschlüsselverknüpfung herzustellen, würde einen 1452 verursachen. Das Problem war der Mangel an Daten in der verknüpften Tabelle.
Ein Beispiel finden Sie hier: http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/
quelle
Ich habe diese Lösungen vorbereitet und dieses Beispiel kann helfen.
Meine Datenbank enthält zwei Tabellen (E-Mail und Kreditkarte) mit Primärschlüsseln für ihre IDs. Eine andere Tabelle (Client) bezeichnet diese Tabellen-IDs als Fremdschlüssel. Ich habe einen Grund, die E-Mail neben den Kundendaten zu haben.
Zuerst füge ich die Zeilendaten für die referenzierten Tabellen (E-Mail, Kreditkarte) ein, dann erhalte ich die ID für jede Tabelle. Diese IDs werden in der dritten Tabelle (Client) benötigt.
Wenn Sie nicht zuerst die Zeilen in die Tabellen einfügen, auf die verwiesen wird, kann MySQL die Entsprechungen nicht herstellen, wenn Sie eine neue Zeile in die dritte Tabelle einfügen, die auf die Fremdschlüssel verweist.
Wenn Sie zuerst die referenzierten Zeilen für die referenzierten Tabellen einfügen, dann die Zeile, die auf Fremdschlüssel verweist, tritt kein Fehler auf.
Hoffe das hilft.
quelle
Stellen Sie sicher, dass sich der Wert in der anderen Tabelle befindet. Andernfalls wird dieser Fehler in der zugewiesenen entsprechenden Spalte angezeigt.
Wenn die Spalte einer Zeilen-ID einer anderen Tabelle zugewiesen ist, stellen Sie sicher, dass sich eine Zeile in der Tabelle befindet. Andernfalls wird dieser Fehler angezeigt.
quelle
Sie können dieses Beispiel ausprobieren
Hinweis: Wenn Sie phpmyadmin verwenden, deaktivieren Sie einfach die Option Fremdschlüsselprüfungen aktivieren
als Beispiel
hoffe, diese Lösung behebt dein Problem :)
quelle
Sie müssen nur eine Frage beantworten:
Speichert Ihre Tabelle bereits Daten? (Insbesondere die Tabelle enthielt Fremdschlüssel.)
Wenn die Antwort Ja lautet, müssen Sie nur alle Datensätze löschen. Anschließend können Sie Ihrer Tabelle einen beliebigen Fremdschlüssel hinzufügen.
Der Grund, warum Sie nach der Dateneingabe keinen Fremdschlüssel hinzufügen können, liegt in der Tabelleninkonsistenz. Wie gehen Sie mit einem neuen Fremdschlüssel in der früheren Tabelle um, die mit Daten gefüllt ist?
Wenn die Antwort Nein lautet, befolgen Sie andere Anweisungen.
quelle
sollte helfen, diese IDs loszuwerden. Wenn dies
null
nicht zulässig istsourcecode_id
, entfernen Sie diese Zeilen oder fügen Sie die fehlenden Werte zursourcecodes
Tabelle hinzu.quelle
Ich hatte das gleiche Problem und fand eine Lösung, Platzierung
NULL
anstattNOT NULL
auf einer Fremdschlüsselspalte zu platzieren. Hier ist eine Abfrage:MySQL hat diese Abfrage ausgeführt!
quelle
In meinem Fall habe ich eine neue Tabelle mit derselben Struktur erstellt, die Beziehungen zu den anderen Tabellen erstellt, dann die Daten in der CSV aus der alten Tabelle extrahiert, die das Problem aufweist, und dann die CSV in die neue Tabelle importiert und die Fremdschlüsselprüfung deaktiviert und deaktivierte Importunterbrechung, alle meine Daten werden in die neue Tabelle eingefügt, die kein Problem erfolgreich hat, und dann die alte Tabelle gelöscht.
Es hat bei mir funktioniert.
quelle