Czy można tymczasowo wyłączyć ograniczenia w MySQL?
Mam dwa modele Django, każdy z kluczem ForeignKey do drugiego. Usunięcie instancji modelu zwraca błąd z powodu ograniczenia ForeignKey:
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 mimo to można tymczasowo wyłączyć ograniczenia i je usunąć?
ON DELETE SET NULL
? Osiągnęłoby to podobną rzecz i nie musiałbyś włączać i wyłączać sprawdzania klucza.Odpowiedzi:
Spróbuj
DISABLE KEYS
lubUpewnij się
po.
źródło
disable keys
dla InnodbAby globalnie wyłączyć ograniczenie klucza obcego, wykonaj następujące czynności:
i pamiętaj, aby ustawić go z powrotem, gdy skończysz
OSTRZEŻENIE: Powinieneś to zrobić tylko podczas konserwacji w trybie pojedynczego użytkownika. Może to spowodować niespójność danych. Na przykład będzie to bardzo pomocne, gdy przesyłasz dużą ilość danych przy użyciu wyjścia mysqldump.
źródło
SET FOREIGN_KEY_CHECKS
prostu zmienia wartość bieżącego połączenia , aSET GLOBAL ..
zmienia wartość wszystkich połączeń , w tym przyszłych połączeń. Jeśli zrobisz to tylkoSET FOREIGN..
w jednym oknie, spróbuj zastosować instrukcję w innym oknie (przez inne połączenie), wartość się tam nie zmieniła. ZGLOBAL
, ta sama zmienna ma tę samą wartość dla obu połączeń.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
Zwykle wyłączam ograniczenia klucza obcego tylko wtedy, gdy chcę obciąć tabelę, a ponieważ wciąż wracam do tej odpowiedzi, to dla mnie w przyszłości:
źródło
Zamiast wyłączać ograniczenie, trwale zmodyfikuj je, aby WŁĄCZYĆ USUŃ NULL. Dzięki temu osiągniesz podobną rzecz i nie będziesz musiał włączać i wyłączać sprawdzania klucza. Tak jak:
Przeczytaj to ( 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 ).
źródło
FOREIGN_KEY_CHECKS
0 i odłożyć go z powrotem po wykonaniu brudnej roboty. Poza tym może zablokować pisanie twoich tabel.Aby wyłączyć ograniczenie klucza obcego globalnie:
i dla aktywnego ograniczenia klucza obcego
źródło
Bardzo proste rozwiązanie z phpmyadmin:
źródło
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
nie działało dla mnie w PHPMyAdmin, ponieważ zapomniałem odznaczyć pole wyboru „Włącz sprawdzanie klucza obcego”. W PHPMyAdmin możesz pominąć te polecenia SET i po prostu odznaczyć pole wyboru.Dla mnie to po prostu
SET FOREIGN_KEY_CHECKS=0;
za mało. Nadal miałemcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Musiałem dodać
ALTER TABLE myTable DISABLE KEYS;
.Więc:
źródło
Jeśli pole klucza ma wartość zerową, możesz również ustawić wartość null przed próbą jej usunięcia:
źródło
W phpMyAdmin możesz wybrać wiele wierszy, a następnie kliknąć akcję usuwania. Wejdziesz do ekranu z listą usuniętych zapytań, możesz odznaczyć zaznaczenie klucza obcego i kliknąć Tak, aby je wykonać.
Umożliwi to usunięcie wierszy, nawet jeśli istnieje ograniczenie ograniczenia ON DELETE.
źródło
Ustawienie ograniczenia klucza obcego na 0 nie jest dobrym pomysłem, ponieważ jeśli tak zrobisz, baza danych nie upewni się, że nie narusza integralności referencyjnej. 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 potomnej będą takie same jak wartość w kolumnie macierzystej. Jeśli nie ma ograniczeń klucza obcego, wiersz potomny może mieć wartość, która nie znajduje się w wierszu nadrzędnym, co może prowadzić do niedokładnych danych.
Załóżmy na przykład, że masz witrynę internetową, na której studenci mogą się zalogować, a każdy uczeń musi zarejestrować się jako konto. Masz jedną tabelę dla identyfikatorów użytkowników, z identyfikatorem użytkownika jako kluczem podstawowym; i kolejna tabela dla kont studentów, z identyfikatorem studenta jako kolumną. Ponieważ każdy uczeń musi mieć identyfikator użytkownika, sensowne byłoby, aby identyfikator studenta z tabeli kont studentów był kluczem obcym, który odwołuje się do identyfikatora użytkownika klucza podstawowego w tabeli identyfikatorów użytkowników. Jeśli nie ma sprawdzania klucza obcego, uczeń może mieć identyfikator studenta i identyfikator użytkownika, co oznacza, że uczeń może uzyskać konto bez bycia użytkownikiem, co jest błędne.
Wyobraź sobie, że dzieje się to z dużą ilością danych. Dlatego potrzebujesz sprawdzenia klucza obcego.
Najlepiej dowiedzieć się, co powoduje błąd. 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.
źródło