it-swarm.com.de

Wie kann ich eine Fremdschlüsseleinschränkung in MySQL vorübergehend deaktivieren?

Ist es möglich, Einschränkungen in MySQL vorübergehend zu deaktivieren?

Ich habe zwei Django-Modelle mit jeweils einem ForeignKey zum anderen. Das Löschen von Instanzen eines Modells gibt einen Fehler aufgrund der ForeignKey-Einschränkung zurück:

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()  #a foreign key constraint fails here

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()

Ist es möglich, Einschränkungen vorübergehend zu deaktivieren und trotzdem zu löschen?

530
jul

Versuchen Sie DISABLE KEYS oder 

SET FOREIGN_KEY_CHECKS=0;

stellen Sie sicher, dass

SET FOREIGN_KEY_CHECKS=1;

nach dem.

1255
Andrew Campbell

Führen Sie folgende Schritte aus, um die Fremdschlüsseleinschränkung global zu deaktivieren:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

denken Sie daran, es zurückzusetzen, wenn Sie fertig sind

SET GLOBAL FOREIGN_KEY_CHECKS=1;

WARNUNG: Sie sollten dies nur tun, wenn Sie den Einzelbenutzermodus warten. Da dies zu Dateninkonsistenz führen könnte. Dies ist beispielsweise sehr hilfreich, wenn Sie eine große Datenmenge mit einer mysqldump-Ausgabe hochladen.

116
berniey

Normalerweise deaktiviere ich Fremdschlüsseleinschränkungen nur dann, wenn ich eine Tabelle abschneiden möchte.

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;
42
AntonioCS

Ändern Sie die Einschränkung nicht dauerhaft, sondern ändern Sie sie dauerhaft in ON DELETE SET NULL. Dies wird eine ähnliche Sache erreichen und Sie müssen die Schlüsselüberprüfung nicht ein- und ausschalten. So wie:

ALTER TABLE tablename1 DROP FOREIGN KEY fk_name1; //get rid of current constraints
ALTER TABLE tablename2 DROP FOREIGN KEY fk_name2;

ALTER TABLE tablename1 
  ADD FOREIGN KEY (table2_id) 
        REFERENCES table2(id)
        ON DELETE SET NULL  //add back constraint

ALTER TABLE tablename2 
  ADD FOREIGN KEY (table1_id) 
        REFERENCES table1(id)
        ON DELETE SET NULL //add back other constraint

Lesen Sie dies ( http://dev.mysql.com/doc/refman/5.5/de/alter-table.html ) und dieses ( http://dev.mysql.com/doc /refman/5.5/de/create-table-foreign-keys.html ).

24
dnagirl

So deaktivieren Sie die Fremdschlüsseleinschränkung global:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

und für aktive Fremdschlüsseleinschränkung

SET GLOBAL FOREIGN_KEY_CHECKS = 1;
8
Umar Tariq

Eine sehr einfache Lösung mit phpmyadmin: Wechseln Sie in Ihrer Tabelle zur Registerkarte SQL. Nachdem Sie den auszuführenden SQL-Befehl bearbeitet haben, befindet sich neben GO ein Kontrollkästchen "Fremdschlüsselprüfung" SQL. Es wird dann automatisch erneut geprüft.

6
svin

Wenn das Schlüsselfeld nullwertfähig ist, können Sie den Wert auch auf null setzen, bevor Sie es löschen:

cursor.execute("UPDATE myapp_item SET myapp_style_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed() 

cursor.execute("UPDATE myapp_style SET myapp_item_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed()

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()
3
Chanoch

Für mich war SET FOREIGN_KEY_CHECKS=0; nicht genug ..__ Ich hatte noch einen com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException.

Ich musste ALTER TABLE myTable DISABLE KEYS; hinzufügen.

So:

SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE myTable DISABLE KEYS;
DELETE FROM myTable;
ALTER TABLE myTable ENABLE KEYS;
SET FOREIGN_KEY_CHECKS=1;
1
RotS

Es ist keine gute Idee, eine Fremdschlüsseleinschränkung auf 0 zu setzen, da Ihre Datenbank dann nicht sicherstellt, dass die referenzielle Integrität nicht verletzt wird. Dies kann zu ungenauen, irreführenden oder unvollständigen Daten führen.

Sie erstellen einen Fremdschlüssel aus einem Grund: weil alle Werte in der untergeordneten Spalte mit einem Wert in der übergeordneten Spalte identisch sein sollen. Wenn keine Fremdschlüsseleinschränkungen vorhanden sind, kann eine untergeordnete Zeile einen Wert haben, der nicht in der übergeordneten Zeile enthalten ist. Dies würde zu ungenauen Daten führen.

Angenommen, Sie haben eine Website, auf die sich die Studenten einloggen können, und jeder Student muss sich als Benutzer für ein Konto registrieren. Sie haben eine Tabelle für Benutzer-IDs mit Benutzer-ID als Primärschlüssel. und eine weitere Tabelle für Studentenkonten mit der Student-ID als Spalte. Da jeder Schüler über eine Benutzer-ID verfügen muss, ist es sinnvoll, die Schüler-ID aus der Tabelle Studentenkonten zu einem Fremdschlüssel zu machen, der auf die Primärschlüssel-Benutzer-ID in der Benutzer-ID-Tabelle verweist. Wenn keine Fremdschlüsselüberprüfungen durchgeführt werden, kann es sein, dass ein Student eine Student-ID und keine Benutzer-ID erhält. Dies bedeutet, dass ein Student ein Konto erhalten kann, ohne ein Benutzer zu sein, was falsch ist.

Stellen Sie sich vor, es passiert eine große Datenmenge. Deshalb brauchen Sie die Fremdschlüsselprüfung.

Es ist am besten, herauszufinden, was den Fehler verursacht. Wahrscheinlich versuchen Sie, aus einer übergeordneten Zeile zu löschen, ohne aus einer untergeordneten Zeile gelöscht zu werden. Versuchen Sie, aus der untergeordneten Zeile zu löschen, bevor Sie sie aus der übergeordneten Zeile löschen. 

0
Valencia Starr

In phpMyAdmin können Sie mehrere Zeilen auswählen und dann auf die Löschaktion klicken. Sie gelangen in ein Fenster, in dem die Löschabfragen aufgelistet sind. Sie können die Überprüfung des Fremdschlüssels deaktivieren und auf Ja klicken, um sie auszuführen. 

Auf diese Weise können Sie Zeilen auch dann löschen, wenn eine Einschränkung von ON DELETE vorliegt. 

0
Julian