2012-06-19 3 views
32

In MySQL möchte ich eine Tabelle löschen.
Ich habe viele Dinge ausprobiert, aber ich bekomme immer wieder den Fehler, dass die Tabelle bericht nicht gelöscht werden kann. Dies ist der Fehler Ich erhalte:Tabelle kann nicht gelöscht werden: Eine Fremdschlüsseleinschränkung schlägt fehl

# 1217 - Es kann keine übergeordnete Zeile löschen oder aktualisieren: ein Fremdschlüssel nicht

Wie lasse ich diese Tabelle?

+2

Finden Sie heraus, welche andere Tabelle es über Fremdschlüssel referenziert, und löschen Sie zunächst die FK-Einschränkung für diese Tabelle, und löschen Sie diese Tabelle. –

+0

Sie müssen die Anforderung von anderen Tabellen auf die, die Sie nicht mehr wünschen, entfernen – BugFinder

+1

Kann Ihnen eine dieser Antworten helfen? http://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails http://stackoverflow.com/questions/3334619/can not-delete-or-update-a-parent-row-a-foreign-key-constraint-failed –

Antwort

44

Versuchen Sie Folgendes:

SELECT * 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'YourTable'; 

Dies sollten Sie liefern die Tabellen Verweise auf die Tabelle haben Sie löschen möchten, wenn Sie diese Referenzen fallen, oder die Datensätze der die Bezugsdatensätzen in dieser Tabelle können Sie die Tabelle löschen tun

+4

Diese Lösung ist viel besser. Es ist sicherer und es ist keine schlechte Übung wie die ausgewählte Antwort. – Sloganho

+1

hat es für mich funktioniert, sollte diese Antwort als akzeptiert markiert werden. – parvez

68

Dies sollte der Trick:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1; 

Wie andere weisen darauf hin, das ist so gut wie nie, was Sie wollen, auch wenn es ist, was in der Frage gestellt. Eine sicherere Lösung ist das Löschen der Tabellen in Abhängigkeit von bericht vor dem Löschen bericht. Siehe CloudyMarble Antwort, wie man das macht. Ich verwende bash und die Methode in meinem Beitrag, um alle Tabellen in einer Datenbank zu löschen, wenn ich die Datenbank selbst nicht löschen will oder kann.

Der Fehler #1217 tritt auf, wenn andere Tabellen Fremdschlüsseleinschränkungen für die zu löschende Tabelle haben und Sie das InnoDB-Datenbankmodul verwenden. Diese Lösung deaktiviert vorübergehend das Überprüfen der Beschränkungen und aktiviert sie dann erneut. Lesen Sie die documentation für mehr. Stellen Sie sicher, dass Sie die Einschränkungen für Fremdschlüssel und Felder in Tabellen je nach bericht löschen. Andernfalls könnten Sie Ihre Datenbank in einem fehlerhaften Zustand belassen.

+2

Dies sollte ausgewählt werden Antwort – kyeno

+0

bis jetzt ist es die beste Antwort und sollte auf der Oberseite sein !!!!!! –

+1

Obwohl es richtig ist, ist es eine erstaunlich SCHLECHTE PRAXIS, dies zu tun. Wie von mehreren Benutzern (einschließlich Rune Kaagaard) gezeigt wurde, sollten Sie die Referenzen finden, analysieren und nach Bedarf löschen. – zozo

1

Dies hat wahrscheinlich die gleiche Tabelle zu anderen Schema der Grund, warum Sie diesen Fehler bekommen.

Sie müssen zuerst die untergeordnete Zeile und dann die übergeordnete Zeile löschen.

0

Ich weiß, dies für eine Weile abgestanden ist und eine Antwort ausgewählt worden war, aber wie über die Alternative der Fremdschlüssel zu ermöglichenNULL und dann wählen ON DELETE SET NULL zu sein.

Grundsätzlich sollten Sie Ihren Tisch wie so geändert werden:

ALTER TABLE 'bericht' DROP FOREIGN KEY 'your_foreign_key';

ALTER TABLE 'bericht' ADD CONSTRAINT 'your_foreign_key' FOREIGN KEY ('column_foreign_key') REFERENCES 'other_table' ('column_parent_key') ON UPDATE CASCADE ON DELETE SET NULL;

Persönlich würde ich empfehlen, beide "ON UPDATE CASCADE" mit sowie "ON DELETE SET NULL" zu vermeiden unnötige Komplikationen, jedoch kann Ihr Setup einen anderen Ansatz diktieren.

Hoffe, das hilft.