Wenn Sie:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Es Fehler:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Hier sind meine Tabellen:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
Der einfache Weg wäre, die Fremdschlüsselprüfung zu deaktivieren. Nehmen Sie die Änderungen vor und aktivieren Sie die Fremdschlüsselprüfung erneut.
quelle
REPLACE INTO tab_with_constraint ...
Unter Ihrem aktuellen (möglicherweise fehlerhaften) Design müssen Sie die Zeile aus der Tabelle der Werbetreibenden löschen, bevor Sie die Zeile in der Jobtabelle löschen können, auf die sie verweist.
Alternativ können Sie Ihren Fremdschlüssel so einrichten, dass beim Löschen in der übergeordneten Tabelle Zeilen in untergeordneten Tabellen automatisch gelöscht werden. Dies wird als kaskadierendes Löschen bezeichnet. Es sieht ungefähr so aus:
Wie andere bereits betont haben, sollte Ihr Fremdschlüssel jedoch umgekehrt sein, da die Tabelle der Werbetreibenden tatsächlich den Primärschlüssel und die Jobtabelle den Fremdschlüssel enthält. Ich würde es so umschreiben:
Und das kaskadierende Löschen ist nicht erforderlich.
quelle
Wenn Sie eine Tabelle löschen möchten, sollten Sie die folgende Abfrage in einem einzigen Schritt ausführen
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE Tabellenname;
quelle
Ich habe die von @Alino Manzi erwähnte Lösung ausprobiert, aber sie funktionierte bei mir in den WordPress-bezogenen Tabellen mit wpdb nicht.
dann habe ich den Code wie folgt geändert und es hat funktioniert
quelle
Ich denke, dass Ihr Fremdschlüssel rückwärts ist. Versuchen:
quelle
Wenn es mehr als einen Job mit derselben Advertiser_ID gibt, sollte Ihr Fremdschlüssel wie folgt lauten:
Andernfalls (wenn es in Ihrem Fall umgekehrt ist), wenn Sie möchten, dass die Zeilen im Werbetreibenden automatisch gelöscht werden, wenn die Zeile im Job gelöscht wird, fügen Sie die Option "CASCADE LÖSCHEN" am Ende Ihres Fremdschlüssels hinzu:
Überprüfen Sie die Fremdschlüsseleinschränkungen
quelle
Sie müssen es nach Reihenfolge löschen. Die Tabellen enthalten Abhängigkeiten
quelle
Wenn Sie eine Datenbank erstellen oder Tabellen erstellen
Sie sollten diese Zeile am oberen Skript hinzufügen, um eine Datenbank oder Tabelle zu erstellen
Jetzt möchten Sie Datensätze aus der Tabelle löschen? dann schreibst du als
Viel Glück!
quelle
Wie wäre es mit dieser Alternative, die ich verwendet habe: Lassen Sie den Fremdschlüssel NULL sein und wählen Sie dann ON DELETE SET NULL .
Persönlich bevorzuge ich die Verwendung von " ON UPDATE CASCADE " sowie " ON DELETE SET NULL ", um unnötige Komplikationen zu vermeiden, aber bei Ihrer Einrichtung möchten Sie möglicherweise einen anderen Ansatz. Das NULL-Senden von Fremdschlüsselwerten kann letztere zu Komplikationen führen, da Sie nicht genau wissen, was dort passiert ist. Diese Änderung sollte also in engem Zusammenhang mit der Funktionsweise Ihres Anwendungscodes stehen.
Hoffe das hilft.
quelle
Ich hatte dieses Problem in Laravel Migration zu
der Reihenfolge der Drop - Tabellen in nach unten () Methode does matter
funktioniert möglicherweise nicht, aber wenn Sie die Reihenfolge ändern, funktioniert es.
quelle
Wenn Sie den Client so schnell wie möglich unterstützen müssen und keinen Zugriff darauf haben
damit die Datenintegrität deaktiviert werden kann:
1) Fremdschlüssel löschen
2) Aktivieren Sie Ihren Löschvorgang über SQL oder API
3) Fügen Sie den Fremdschlüssel wieder zum Schema hinzu
Es handelt sich jedoch um eine Hotfix-Lösung, die auf eigenes Risiko erfolgt, da der Hauptfehler eines solchen Ansatzes darin besteht, dass die Datenintegrität anschließend manuell beibehalten werden muss.
quelle
Sie können einen Auslöser erstellen, um die referenzierten Zeilen vor dem Löschen des Jobs zu löschen.
quelle
Das Hauptproblem bei diesem Fehler
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
besteht darin, dass Sie nicht wissen, welche Tabelle den FK-Fehler enthält , sodass es schwierig ist, den Konflikt zu lösen.Wenn Sie MySQL oder ähnliches verwenden, habe ich festgestellt, dass Sie ein ER-Diagramm für Ihre Datenbank erstellen und dann alle Konflikte, die den Fehler auslösen, überprüfen und sicher entfernen können.
connection
database
& auszuwählentables
, die überprüft werden müssenquelle
Grundsätzlich liegt der Grund für diese Art von Fehler darin, dass Sie möglicherweise versuchen, ein Tupple zu löschen, das einen Primärschlüssel (Stammtabelle) enthält und dessen Primärschlüssel in der untergeordneten Tabelle als Fremdschlüssel verwendet wird. In diesem Szenario müssen Sie zum Löschen übergeordneter Tabellendaten untergeordnete Tabellendaten entfernen (in denen der Fremdschlüssel verwendet wird). Vielen Dank
quelle
Dies ist mir auch passiert und aufgrund einer Abhängigkeit und Referenz von anderen Tabellen konnte ich den Eintrag nicht entfernen. Ich habe der Tabelle eine Löschspalte (vom Typ Boolean) hinzugefügt. Der Wert in diesem Feld zeigte an, ob das Element zum Löschen markiert ist oder nicht. Wenn zum Löschen markiert, nicht abrufen / verwenden; Andernfalls verwenden Sie es.
quelle
Vielleicht sollten Sie ON DELETE CASCADE ausprobieren
quelle