V SQLite nejsou omezení cizích klíčů vynucována, pokud nebyla povolena podpora cizích klíčů.
Povolení cizích klíčů zahrnuje následující:
- Povolte cizí klíče při kompilaci SQLite.
- Povolit cizí klíče za běhu.
Povolit cizí klíče při kompilaci SQLite
Pokud jde o kompilaci SQLite, není to ani tak otázka povolení cizí klíče – jde spíše o to nezakázat je.
Povolení cizích klíčů při kompilaci SQLite jednoduše znamená, že nepoužíváte SQLITE_OMIT_FOREIGN_KEY
a SQLITE_OMIT_TRIGGER
při kompilaci.
Pokud SQLITE_OMIT_TRIGGER
je definován, ale SQLITE_OMIT_FOREIGN_KEY
není, pak jsou definice cizích klíčů analyzovány a lze se na ně dotazovat pomocí PRAGMA foreign_key_list
, ale omezení cizího klíče se nevynucují. PRAGMA foreign_keys
příkaz je v této konfiguraci nefunkční.
Pokud OMIT_FOREIGN_KEY
je definováno, pak nelze definice cizího klíče ani analyzovat (pokus o zadání definice cizího klíče je syntaktická chyba).
Povolit cizí klíče za běhu
I když byla knihovna zkompilována s povolenými omezeními cizího klíče, stále musíte povolit podporu cizích klíčů za běhu.
Můžete to provést pomocí následujícího kódu:
PRAGMA foreign_keys = ON;
Jako u většiny PRAGMA
příkazy, můžete alternativně nahradit ON
s TRUE
, YES
, nebo 1
.
Jakmile to spustíte, budou vaše cizí klíče vynuceny.
Upozorňujeme, že toto nastavení není nutné pro vytváření cizí klíče, ale je to nutné pro vynucení cizí klíče.
Další připojení
Všimněte si, že to povolí pouze omezení cizího klíče pro aktuální připojení k databázi.
Pokud otevřete nové připojení, budete muset tento příkaz spustit znovu, pokud chcete, aby byly v tomto připojení vynuceny cizí klíče.
Zkontrolujte podporu cizího klíče pro aktuální připojení
Spuštěním následujícího kódu můžete také zkontrolovat, zda již byly povoleny cizí klíče pro vaše aktuální připojení.
PRAGMA foreign_keys;
Výsledek:
1
V mém případě jsem pro toto připojení již povolil cizí klíče, takže výsledek je 1. Pokud by byly cizí klíče zakázány, výsledek by byl 0.
Zde je příklad deaktivace, kontroly hodnoty, poté povolení a opětovné kontroly hodnoty.
PRAGMA foreign_keys = FALSE;
PRAGMA foreign_keys;
PRAGMA foreign_keys = YES;
PRAGMA foreign_keys;
Výsledek:
sqlite> PRAGMA foreign_keys = FALSE; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 0 sqlite> PRAGMA foreign_keys = YES; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 1