SQLite obsahuje příkaz PRAGMA, který vám umožňuje zkontrolovat porušení cizího klíče v celé databázi nebo dané tabulce.
Příkaz je PRAGMA foreign_key_check
a funguje následovně.
Syntaxe
Můžete jej použít jedním ze dvou způsobů:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
První řádek kontroluje celou databázi, zatímco druhý kontroluje pouze konkrétní tabulku.
Volitelné schema
argument určuje název připojené databáze nebo hlavní nebo teplota pro hlavní a TEMP databáze. Pokud schema
je vynecháno, hlavní se předpokládá.
Příklad
Vytvořme dvě tabulky se vztahem mezi nimi.
V tomto případě Zvířata tabulka má cizí klíč, který odkazuje na TypId ve sloupci Typy tabulka.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Nyní zadáme data, která porušují omezení cizího klíče.
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
Druhý INSERT
příkaz porušuje omezení cizího klíče. Je to proto, že do Pets.TypeId vloží hodnotu 3 ve sloupci Typy.TypeId sloupec.
Zde je důležité poznamenat, že jsem výslovně zakázal cizí klíče pomocí PRAGMA foreign_keys = OFF
. Toto je výchozí nastavení v SQLite, ale chtěl jsem to v tomto příkladu objasnit.
Nyní zkontrolujeme databázi, zda nedošlo k porušení cizího klíče.
PRAGMA foreign_key_check;
Výsledek:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
To nám říká, že Zvířata tabulka má porušení cizího klíče na řádku s ROWID 1. Také nám sděluje název nadřazené tabulky a také ID cizího klíče.
Pojďme přidat další data do Zvířatů tabulky a znovu spusťte kontrolu. První dva řádky se drží cizího klíče, ale poslední ne.
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
Výsledek:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Nyní máme dva řádky vrácené při kontrole celé databáze na porušení cizího klíče.
Zkontrolujte konkrétní tabulku
Můžete také zadat tabulku, proti které se má kontrola spustit.
Zde je příklad přepsání předchozího šeku tak, aby specifikoval pouze Zvířata tabulka.
PRAGMA foreign_key_check(Pets);
Výsledek:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Stejný výsledek.
Zde je výsledek, pokud specifikuji druhou tabulku.
PRAGMA foreign_key_check(Types);
Výsledek:
(Je prázdné, protože neexistují žádné výsledky.)
Zadejte schéma
Jak již bylo zmíněno, můžete také určit schéma.
PRAGMA main.foreign_key_check(Pets);
Výsledek:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
V mém případě jsem použil hlavní databázi, ale můžete nahradit main
s názvem vaší připojené databáze.
Jak vynutit cizí klíče
Jak bylo zmíněno, SQLite nevynucuje cizí klíče, pokud výslovně neurčíte, že by měly být vynuceny.
Cizí klíče můžete vynutit pomocí PRAGMA foreign_keys = ON
.
Další informace a příklady najdete v části Jak povolit podporu cizích klíčů v SQLite.