Jak tymczasowo wyłączyć ograniczenie klucza obcego w MySQL?

Czy można tymczasowo wyłączyć ograniczenia w MySQL?

Mam dwa modele Django, każdy z obcym kluczem do drugiego. Usunięcie instancji modelu zwraca błąd z powodu ograniczenia klucza obcego:

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()

Czy możliwe jest tymczasowe wyłączenie ograniczeń i usunięcie?

Author: Peter Mortensen, 2013-03-19

10 answers

Try DISABLE KEYS or

SET FOREIGN_KEY_CHECKS=0;

Upewnij się, że

SET FOREIGN_KEY_CHECKS=1;
Po.
 1538
Author: Andrew Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-27 16:37:41

Aby wyłączyć ograniczenie klucza obcego globalnie, wykonaj następujące czynności:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

I pamiętaj, aby ustawić go z powrotem, gdy skończysz

SET GLOBAL FOREIGN_KEY_CHECKS=1;

Ostrzeżenie: powinieneś to robić tylko wtedy, gdy wykonujesz konserwację trybu pojedynczego użytkownika. Ponieważ może to spowodować niespójność danych. Na przykład, będzie to bardzo pomocne, gdy przesyłasz dużą ilość danych za pomocą wyjścia mysqldump.

 159
Author: berniey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-26 19:20:55

Normalnie wyłączam ograniczenia klucza obcego tylko wtedy, gdy chcę obciąć tabelę, a ponieważ wciąż wracam do tej odpowiedzi, to jest to dla przyszłych mnie:

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;
 57
Author: AntonioCS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 16:48:42

Zamiast wyłączać ograniczenie, trwale zmodyfikuj je na ON DELETE SET NULL. To osiągnie podobną rzecz i nie będziesz musiał włączać i wyłączać sprawdzania kluczy. Tak:

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

Have a read of this ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html) i to ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html).

 27
Author: dnagirl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 14:33:29

Aby wyłączyć ograniczenie klucza obcego globalnie:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

I dla ograniczenia aktywnego klucza obcego:

SET GLOBAL FOREIGN_KEY_CHECKS = 1;
 15
Author: Umar Tariq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-27 16:41:55

Bardzo proste rozwiązanie z phpMyAdmin :

  • w tabeli przejdź do zakładki SQL
  • Po edycji polecenia SQL, które chcesz uruchomić, obok GO znajduje się pole wyboru o nazwie "Enable foreign key checks " .
  • odznacz to pole wyboru i uruchom swój SQL. Zostanie on automatycznie ponownie sprawdzony po wykonaniu.
 10
Author: svin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-27 16:41:26

Dla mnie to nie wystarczyło. Nadal miałem com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException.

Musiałem dodać ALTER TABLE myTable DISABLE KEYS;.

Więc:

SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE myTable DISABLE KEYS;
DELETE FROM myTable;
ALTER TABLE myTable ENABLE KEYS;
SET FOREIGN_KEY_CHECKS=1;
 6
Author: RotS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 10:16:36

Jeśli pole key jest nullable, możesz również ustawić wartość null przed próbą jego usunięcia:

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
Author: Chanoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-30 21:18:22

W phpMyAdmin możesz wybrać wiele wierszy, a następnie kliknąć akcję Usuń. Pojawi się ekran z listą zapytań delete. Wygląda tak:

Tutaj wpisz opis obrazka

Usuń zaznaczenie pola wyboru "Włącz sprawdzanie kluczy obcych" i kliknij Yes, aby je wykonać.

Umożliwi to usuwanie wierszy, nawet jeśli istnieje ograniczenie dotyczące usuwania.

 2
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-30 09:22:04

Nie jest dobrym pomysłem ustawienie ograniczenia klucza obcego na 0, ponieważ jeśli to zrobisz, Twoja baza danych nie upewni się, że nie narusza integralności odniesienia. Może to prowadzić do niedokładnych, wprowadzających w błąd lub niekompletnych danych.

Tworzysz klucz obcy z jakiegoś powodu: ponieważ wszystkie wartości w kolumnie podrzędnej będą takie same jak wartości w kolumnie nadrzędnej. Jeśli nie ma ograniczeń klucza obcego, wiersz potomny może mieć wartość, która nie znajduje się w wierszu nadrzędnym, co prowadziłoby do niedokładności data.

Na przykład, załóżmy, że masz stronę internetową dla studentów do logowania i każdy uczeń musi zarejestrować konto jako użytkownik. Masz jedną tabelę dla identyfikatorów użytkowników, z identyfikatorem użytkownika jako kluczem głównym; i inną tabelę dla kont studenckich, z identyfikatorem Studenckim jako kolumną. Ponieważ każdy uczeń musi mieć identyfikator użytkownika, sensowne byłoby uczynienie identyfikatora studenckiego z tabeli kont studenckich kluczem obcym, który odwołuje się do podstawowego identyfikatora użytkownika w tabeli ID użytkownika. Jeśli nie ma klucza obcego sprawdzanie, student może skończyć z legitymacją studencką i bez identyfikatora użytkownika, co oznacza, że student może uzyskać konto bez bycia użytkownikiem, co jest złe.

Wyobraź sobie, że dzieje się to z dużą ilością danych. Dlatego potrzebujesz czeku z zagranicznym kluczem.

Najlepiej dowiedzieć się, co jest przyczyną błędu. Najprawdopodobniej próbujesz usunąć z wiersza nadrzędnego bez usuwania z wiersza podrzędnego. Spróbuj usunąć z wiersza podrzędnego przed usunięciem z wiersza nadrzędnego.

 -2
Author: Valencia Starr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 09:24:25