809 Stimmen

Wie kann ich eine Fremdschlüssel-Beschränkung in MySQL vorübergehend deaktivieren?

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

Ich habe zwei Django-Modelle, jedes mit einem Fremdschlüssel zu dem anderen. Das Löschen von Instanzen eines Modells gibt aufgrund der Fremdschlüssel-Beschrä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, Beschränkungen vorübergehend zu deaktivieren und trotzdem zu löschen?

1734voto

Andrew Campbell Punkte 17475

Versuchen Sie DISABLE KEYS o

SET FOREIGN_KEY_CHECKS=0;

Stellen Sie sicher, dass

SET FOREIGN_KEY_CHECKS=1;

nach.

187voto

berniey Punkte 2592

Um die Fremdschlüssel-Beschränkung global zu deaktivieren, gehen Sie wie folgt vor:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

und denken Sie daran, es zurückzustellen, wenn Sie fertig sind.

SET GLOBAL FOREIGN_KEY_CHECKS=1;

WARNUNG: Sie sollten dies nur tun, wenn Sie eine Wartung im Einzelbenutzermodus durchführen. Es könnte nämlich zu Dateninkonsistenzen führen. Es ist zum Beispiel sehr hilfreich, wenn Sie große Datenmengen mit einer mysqldump-Ausgabe hochladen.

72voto

AntonioCS Punkte 8100

Normalerweise deaktiviere ich Fremdschlüsselbeschränkungen nur, wenn ich eine Tabelle abschneiden möchte, und da ich immer wieder auf diese Antwort zurückkomme, ist dies für mich in Zukunft:

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

28voto

dnagirl Punkte 19738

Anstatt Ihre Einschränkung zu deaktivieren, ändern Sie sie dauerhaft in ON DELETE SET NULL. Damit erreichen Sie das Gleiche, und Sie müssen die Schlüsselprüfung nicht ein- und ausschalten. Zum Beispiel so:

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 das hier ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) und diese ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html ).

28voto

Umar Tariq Punkte 1053

Um die Fremdschlüssel-Beschränkung global zu deaktivieren:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

Und für die aktive Fremdschlüssel-Beschränkung:

SET GLOBAL FOREIGN_KEY_CHECKS = 1;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X