Ist es möglich, Einschränkungen in MySQL vorübergehend zu deaktivieren?
Ich habe zwei Django-Modelle, jedes mit einem ForeignKey zum anderen. Das Löschen von Instanzen eines Modells gibt aufgrund der ForeignKey-Einschränkung einen Fehler 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?
ON DELETE SET NULL
? Das würde eine ähnliche Sache bewirken und Sie müssten die Schlüsselüberprüfung nicht ein- und ausschalten.Antworten:
Versuchen Sie es
DISABLE KEYS
oderstellen Sie sicher, dass
nach.
quelle
disable keys
für InnodbGehen Sie wie folgt vor, um die Fremdschlüsseleinschränkung global zu deaktivieren:
und denken Sie daran, es zurückzusetzen, wenn Sie fertig sind
WARNUNG: Sie sollten dies nur tun, wenn Sie die Wartung im Einzelbenutzermodus durchführen. Dies könnte zu Dateninkonsistenzen führen. Dies ist beispielsweise sehr hilfreich, wenn Sie eine große Datenmenge mit einer mysqldump-Ausgabe hochladen.
quelle
SET FOREIGN_KEY_CHECKS
der Wert für die aktuelle VerbindungSET GLOBAL ..
geändert wird , während der Wert für alle Verbindungen , einschließlich zukünftiger Verbindungen , geändert wird . Wenn Sie dies nurSET FOREIGN..
in einem Fenster tun , versuchen Sie, die Anweisung in einem anderen Fenster (über eine andere Verbindung) anzuwenden. Der Wert hat sich dort nicht geändert. MitGLOBAL
hat dieselbe Variable für beide Verbindungen den gleichen Wert.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
Normalerweise deaktiviere ich Fremdschlüsseleinschränkungen nur, wenn ich eine Tabelle abschneiden möchte, und da ich immer wieder auf diese Antwort zurückkomme, ist dies für die Zukunft für mich:
quelle
Anstatt Ihre Einschränkung zu deaktivieren, ändern Sie sie dauerhaft in ON DELETE SET NULL. Damit wird eine ähnliche Sache erreicht, und Sie müssten die Schlüsselüberprüfung nicht ein- und ausschalten. Wie so:
Lesen Sie dies ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) und dieses ( http://dev.mysql.com/doc/refman/5.5/en) /create-table-foreign-keys.html ).
quelle
FOREIGN_KEY_CHECKS
auf 0 zu setzen und ihn nach Abschluss der Drecksarbeit wieder zurückzusetzen. Außerdem könnte es für das Schreiben Ihrer Tabellen gesperrt werden.So deaktivieren Sie die Fremdschlüsseleinschränkung global:
und für aktive Fremdschlüsseleinschränkung
quelle
Eine sehr einfache Lösung mit phpmyadmin:
quelle
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
in PHPMyAdmin nicht funktioniert, da ich vergessen habe, das Kontrollkästchen "Fremdschlüsselprüfungen aktivieren" zu deaktivieren. In PHPMyAdmin können Sie diese SET-Befehle überspringen und einfach das Kontrollkästchen deaktivieren.Für mich war das einfach
SET FOREIGN_KEY_CHECKS=0;
nicht genug. Ich hatte immer noch einecom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Ich musste hinzufügen
ALTER TABLE myTable DISABLE KEYS;
.Damit:
quelle
Wenn das Schlüsselfeld nullbar ist, können Sie den Wert auch auf null setzen, bevor Sie versuchen, ihn zu löschen:
quelle
In phpMyAdmin können Sie mehrere Zeilen auswählen und dann auf die Löschaktion klicken. Sie gelangen auf einen Bildschirm, 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 löschen, auch wenn die Einschränkung ON DELETE vorliegt.
quelle
Es ist keine gute Idee, eine Fremdschlüsseleinschränkung auf 0 zu setzen, da Ihre Datenbank sonst nicht sicherstellen würde, 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: Alle Werte in der untergeordneten Spalte müssen mit einem Wert in der übergeordneten Spalte übereinstimmen. Wenn es keine Fremdschlüsseleinschränkungen gibt, kann eine untergeordnete Zeile einen Wert haben, der sich nicht in der übergeordneten Zeile befindet, was zu ungenauen Daten führen würde.
Angenommen, Sie haben eine Website, auf der sich Schüler anmelden können, und jeder Schüler muss sich für ein Konto als Benutzer registrieren. Sie haben eine Tabelle für Benutzer-IDs mit der Benutzer-ID als Primärschlüssel. und eine weitere Tabelle für Studentenkonten mit der Studenten-ID als Spalte. Da jeder Schüler eine Benutzer-ID haben muss, ist es sinnvoll, die Schüler-ID aus der Schülerkonten-Tabelle zu einem Fremdschlüssel zu machen, der auf die Primärschlüssel-Benutzer-ID in der Benutzer-ID-Tabelle verweist. Wenn keine Fremdschlüsselprüfungen durchgeführt werden, hat ein Schüler möglicherweise eine Schüler-ID und keine Benutzer-ID. Dies bedeutet, dass ein Schüler ein Konto erhalten kann, ohne ein Benutzer zu sein, was falsch ist.
Stellen Sie sich vor, es passiert mit einer großen Datenmenge. Deshalb benötigen Sie die Fremdschlüsselprüfung.
Es ist am besten herauszufinden, was den Fehler verursacht. Höchstwahrscheinlich versuchen Sie, aus einer übergeordneten Zeile zu löschen, ohne aus einer untergeordneten Zeile zu löschen. Versuchen Sie, aus der untergeordneten Zeile zu löschen, bevor Sie aus der übergeordneten Zeile löschen.
quelle