W SQLite ograniczenia kluczy obcych nie są wymuszane, chyba że obsługa kluczy obcych jest włączona.
Włączenie kluczy obcych obejmuje następujące czynności:
- Włącz klucze obce podczas kompilacji SQLite.
- Włącz klucze obce w czasie wykonywania.
Włącz klucze obce podczas kompilacji SQLite
Jeśli chodzi o kompilację SQLite, nie chodzi o włączenie klucze obce – bardziej chodzi o nie wyłączanie ich.
Włączenie kluczy obcych podczas kompilacji SQLite oznacza po prostu, że nie używasz SQLITE_OMIT_FOREIGN_KEY
i SQLITE_OMIT_TRIGGER
podczas kompilacji.
Jeśli SQLITE_OMIT_TRIGGER
jest zdefiniowany, ale SQLITE_OMIT_FOREIGN_KEY
nie jest, definicje kluczy obcych są analizowane i mogą być odpytywane za pomocą PRAGMA foreign_key_list
, ale ograniczenia klucza obcego nie są wymuszane. PRAGMA foreign_keys
w tej konfiguracji polecenie jest nie do wykonania.
Jeśli OMIT_FOREIGN_KEY
jest zdefiniowany, wtedy definicje klucza obcego nie mogą być nawet analizowane (próba określenia definicji klucza obcego jest błędem składni).
Włącz klucze obce w czasie wykonywania
Nawet jeśli biblioteka została skompilowana z włączonymi ograniczeniami klucza obcego, nadal musisz włączyć obsługę klucza obcego w czasie wykonywania.
Możesz to zrobić za pomocą następującego kodu:
PRAGMA foreign_keys = ON;
Jak w przypadku większości PRAGMA
oświadczenia, możesz alternatywnie zastąpić ON
z TRUE
, YES
lub 1
.
Gdy to zrobisz, twoje klucze obce zostaną wymuszone.
Pamiętaj, że to ustawienie nie jest wymagane do tworzenia klucze obce, ale jest to wymagane do wymuszania klucze obce.
Inne połączenia
Zauważ, że włącza to tylko ograniczenia klucza obcego dla bieżącego połączenia z bazą danych.
Jeśli otworzysz nowe połączenie, musisz ponownie uruchomić tę instrukcję, jeśli chcesz, aby klucze obce były wymuszone w tym połączeniu.
Sprawdź obsługę kluczy obcych dla bieżącego połączenia
Możesz również sprawdzić, czy klucze obce zostały już włączone dla bieżącego połączenia, uruchamiając następujący kod.
PRAGMA foreign_keys;
Wynik:
1
W moim przypadku włączyłem już klucze obce dla tego połączenia, więc wynik to 1. Jeśli klucze obce zostały wyłączone, wynikiem będzie 0.
Oto przykład wyłączenia, sprawdzenia wartości, a następnie włączenia i ponownego sprawdzenia wartości.
PRAGMA foreign_keys = FALSE;
PRAGMA foreign_keys;
PRAGMA foreign_keys = YES;
PRAGMA foreign_keys;
Wynik:
sqlite> PRAGMA foreign_keys = FALSE; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 0 sqlite> PRAGMA foreign_keys = YES; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 1