In SQLite worden beperkingen voor externe sleutels niet afgedwongen, tenzij ondersteuning voor externe sleutels is ingeschakeld.
Het inschakelen van externe sleutels houdt het volgende in:
- Schakel buitenlandse sleutels in bij het compileren van SQLite.
- Schakel buitenlandse sleutels in tijdens runtime.
Schakel buitenlandse sleutels in bij het compileren van SQLite
Als het gaat om het compileren van SQLite, is het niet zozeer een kwestie van inschakelen buitenlandse sleutels - het is meer een kwestie van niet uitschakelen hen.
Externe sleutels inschakelen bij het compileren van SQLite betekent gewoon dat u SQLITE_OMIT_FOREIGN_KEY
niet gebruikt en SQLITE_OMIT_TRIGGER
bij het compileren.
Als SQLITE_OMIT_TRIGGER
is gedefinieerd, maar SQLITE_OMIT_FOREIGN_KEY
is niet, dan worden de definities van buitenlandse sleutels geparseerd en kunnen ze worden opgevraagd met behulp van PRAGMA foreign_key_list
, maar beperkingen voor externe sleutels worden niet afgedwongen. De PRAGMA foreign_keys
commando is een no-op in deze configuratie.
Als OMIT_FOREIGN_KEY
is gedefinieerd, kunnen externe-sleuteldefinities niet eens worden geparseerd (poging om een externe-sleuteldefinitie op te geven is een syntaxisfout).
Externe sleutels inschakelen tijdens runtime
Zelfs als de bibliotheek is gecompileerd met beperkingen voor externe sleutels ingeschakeld, moet u nog steeds ondersteuning voor externe sleutels inschakelen tijdens runtime.
U kunt dit doen met de volgende code:
PRAGMA foreign_keys = ON;
Zoals bij de meeste PRAGMA
verklaringen, kunt u ook ON
. vervangen met TRUE
, YES
, of 1
.
Als je dat eenmaal hebt uitgevoerd, worden je buitenlandse sleutels afgedwongen.
Merk op dat deze instelling niet vereist is voor het maken buitenlandse sleutels, maar het is vereist voor afdwingen buitenlandse sleutels.
Andere verbindingen
Houd er rekening mee dat hierdoor alleen externe-sleutelbeperkingen voor de huidige databaseverbinding worden ingeschakeld.
Als u een nieuwe verbinding opent, moet u die instructie opnieuw uitvoeren als u wilt dat externe sleutels in die verbinding worden afgedwongen.
Controleer de ondersteuning voor externe sleutels voor de huidige verbinding
U kunt ook controleren of externe sleutels al zijn ingeschakeld voor uw huidige verbinding door de volgende code uit te voeren.
PRAGMA foreign_keys;
Resultaat:
1
In mijn geval heb ik buitenlandse sleutels al ingeschakeld voor deze verbinding, dus het resultaat is 1. Als buitenlandse sleutels waren uitgeschakeld, zou het resultaat 0 zijn.
Hier is een voorbeeld van uitschakelen, de waarde controleren, vervolgens inschakelen en opnieuw controleren.
PRAGMA foreign_keys = FALSE;
PRAGMA foreign_keys;
PRAGMA foreign_keys = YES;
PRAGMA foreign_keys;
Resultaat:
sqlite> PRAGMA foreign_keys = FALSE; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 0 sqlite> PRAGMA foreign_keys = YES; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 1