wake-up-neo.com

Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl

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 Tische:

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`);
126
steven

In diesem Fall müssen Sie die Zeile aus der Advertiser-Tabelle löschen, bevor Sie die Zeile in der Jobtabelle löschen können, auf die sie verweist. Diese:

ALTER TABLE `advertisers`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) 
      REFERENCES `jobs` (`advertiser_id`);

... ist eigentlich das Gegenteil von dem, was es sein sollte. Es bedeutet, dass Sie vor den Werbetreibenden einen Datensatz in der Jobtabelle haben müssen. Sie müssen also Folgendes verwenden:

ALTER TABLE `jobs`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) 
      REFERENCES `advertisers` (`advertiser_id`);

Wenn Sie die Fremdschlüsselbeziehung korrigiert haben, funktioniert Ihre Löschanweisung.

83
OMG Ponies

Die einfache Möglichkeit wäre, die Fremdschlüsselprüfung zu deaktivieren. Nehmen Sie die Änderungen vor und aktivieren Sie die Fremdschlüsselprüfung erneut.

SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
206
Alino Manzi

Bei 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 ein Löschen in der übergeordneten Tabelle das automatische Löschen von Zeilen in untergeordneten Tabellen bewirkt. Dies wird als kaskadierendes Löschen bezeichnet. Es sieht ungefähr so ​​aus:

ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;

Wie bereits erwähnt, fühlt sich Ihr Fremdschlüssel, wie bereits erwähnt, anders verhalten, da die Tabelle der Werbetreibenden wirklich den Primärschlüssel enthält und die Auftragstabelle den Fremdschlüssel. Ich würde es so umschreiben:

ALTER TABLE `jobs`
ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`);

Und das kaskadierende Löschen ist nicht erforderlich.

29
Asaph

Wenn Sie eine Tabelle löschen möchten, müssen Sie die folgende Abfrage in einem einzigen Schritt ausführen

SET FOREIGN_KEY_CHECKS = 0; DROP TABLE Tabellenname;

15
Abin John

Ich denke, dass Ihr Fremdschlüssel rückständig ist. Versuchen:

ALTER TABLE 'jobs'
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`)
6
Tom H

Wenn es mehr als einen Job mit derselben Advertiser_id gibt, sollte Ihr Fremdschlüssel folgendermaßen lauten:

ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1` 
FOREIGN KEY (`advertiser_id`) 
REFERENCES `advertisers` (`advertiser_id`);

Andernfalls (wenn dies umgekehrt der Fall ist), wenn die Zeilen im Werbetreibenden automatisch gelöscht werden sollen, wenn die Zeile im Job gelöscht wird, fügen Sie Ihrem Fremdschlüssel die Option 'ON DELETE CASCADE' hinzu

ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` 
FOREIGN KEY (`advertiser_id`) 
REFERENCES `jobs` (`advertiser_id`);
ON DELETE CASCASE

Check out Fremdschlüsseleinschränkungen

3
Rashmi Pandit

Wenn Sie eine Datenbank erstellen oder Tabellen erstellen 

Sie sollten diese Zeile in der obersten Skript-Datenbank oder Tabelle hinzufügen

SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;

Jetzt möchten Sie Datensätze aus der Tabelle löschen? dann schreibst du als

SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1

Viel Glück!

2
Quy Le

Ich hatte dieses Problem in Laravel Migration  
Die Reihenfolge der Drop-Tabellen in der down () -Methode spielt eine Rolle

Schema::dropIfExists('groups');
Schema::dropIfExists('contact');

funktioniert möglicherweise nicht, aber wenn Sie die Reihenfolge ändern, funktioniert es.

Schema::dropIfExists('contact');
Schema::dropIfExists('groups');
2
Amin

Wie wäre es mit dieser von mir verwendeten Alternative: Erlaube dem FremdschlüsselNULLund wähle dann ON DELETE SET NULL .

Ich persönlich bevorzuge die Verwendung von "ON UPDATE CASCADE" sowie von "ON DELETE SET NULL", um unnötige Komplikationen zu vermeiden, aber bei der Einrichtung möchten Sie möglicherweise einen anderen Ansatz. NULL-Werte für Fremdschlüssel können letztere zu Komplikationen führen, da Sie nicht genau wissen, was genau dort passiert ist. Diese Änderung sollte also in engem Zusammenhang mit der Funktionsweise Ihres Anwendungscodes stehen.

Hoffe das hilft.

1
Marius Cucuruz

Sie müssen es in der Reihenfolge .__ löschen. In den Tabellen gibt es Abhängigkeiten 

1
Ran Adler

Sie können einen Auslöser erstellen, um die referenzierten Zeilen zu löschen, bevor Sie den Job löschen.

    DELIMITER $$
    CREATE TRIGGER before_jobs_delete 
        BEFORE DELETE ON jobs
        FOR EACH ROW 
    BEGIN
        delete from advertisers where advertiser_id=OLD.advertiser_id;
    END$$
    DELIMITER ;
0
Patch92

Das Hauptproblem bei diesem Fehler Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails ist, dass Sie nicht wissen , welche Tabelle den FK-Fehler enthält , weshalb dies schwierig ist den Konflikt lösen.

Wenn Sie MySQL oder ähnliches verwenden, habe ich herausgefunden, dass Sie ein ER-Diagramm für Ihre Datenbank erstellen können, dann können Sie alle Konflikte, die den Fehler auslösen, überprüfen und sicher entfernen.

  1. Verwenden Sie die MySQL-Workbench
  2. Klicken Sie auf Datenbank -> Reverse Engineering
  3. Wählen Sie ein korrektes connection
  4. Denken Sie bis zum Ende daran, database & tables auszuwählen, die überprüft werden müssen
  5. Jetzt haben Sie das ER-Diagramm, Sie können sehen, welche Tabelle FK-Konflikt haben
0
Ng Sek Long

Vielleicht sollten Sie es mit DELETE CASCADE versuchen

0
UFOman

wenn Sie den Client so schnell wie möglich unterstützen müssen und keinen Zugriff auf haben 

FOREIGN_KEY_CHECKS

so kann die Datenintegrität deaktiviert werden:

1) Fremdschlüssel löschen

ALTER TABLE `advertisers` 
DROP FOREIGN KEY `advertisers_ibfk_1`;

2) Aktivieren Sie Ihre Löschoperation durch SQL oder API

3) fügen Sie den Fremdschlüssel wieder dem Schema hinzu

ALTER TABLE `advertisers`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);

dies ist jedoch ein Hotfix, also auf eigenes Risiko, da der Hauptfehler eines solchen Ansatzes darin besteht, dass die Datenintegrität anschließend manuell aufrechterhalten werden muss.

0