V SQLite můžete tabulku zrušit pomocí DROP TABLE
prohlášení.
Volitelně můžete přidat IF EXISTS
klauzule k potlačení všech chyb, které by mohly nastat, pokud tabulka neexistuje.
Pokud na tabulku odkazuje cizí klíč, je třeba si uvědomit několik věcí.
Příklad
Zde je příklad, který demonstruje nejjednodušší způsob zrušení tabulky v SQLite:
DROP TABLE t1;
Tím se zruší tabulka nazvaná t1
.
Volitelně můžete před názvem tabulky uvést název schématu.
Pomocí IF EXISTS
Ustanovení
Můžete použít IF EXISTS
klauzule k potlačení všech chyb, které by mohly nastat v případě, že tabulka neexistuje.
DROP TABLE IF EXISTS t2;
Pokud odebereme IF EXISTS
klauzuli a spusťte ji znovu, dostaneme chybu.
Příklad:
DROP TABLE t2;
Výsledek:
Error: no such table: t2
Závislosti cizího klíče a zobrazení
SQLite nepodporuje CASCADE
a RESTRICT
klíčová slova, která jsou součástí standardu SQL a jsou podporována některými dalšími RDBMS (jako je PostgreSQL). Tato klíčová slova jsou navržena tak, aby specifikovala, co dělat, když má cílová tabulka závislosti (jako je zobrazení nebo cizí klíč, který na tabulku odkazuje).
Vzhledem k tomu, že SQLite tato klíčová slova nepodporuje, zde je návod, jak SQLite zachází s pohledy a cizími klíči, když se pokusíte tabulku vypustit.
SQLite ignoruje všechny závislé pohledy. Jinými slovy, jde dopředu a padá z tabulky, i když existuje pohled, který na něj odkazuje.
Pokud jde o cizí klíče…
Za prvé, cizí klíče jsou ve výchozím nastavení v SQLite zakázány. Pokud je tedy nepovolíte, žádné cizí klíče, které odkazují na cílovou tabulku, nebudou mít žádný vliv na odstranění cílové tabulky. Jinými slovy, tabulka bude zrušena.
Pokud jsou ve vaší relaci povoleny cizí klíče, zabrání shození tabulky pouze v případě, že existují data, která tento cizí klíč poruší. Pokud vaše podřízená tabulka neobsahuje žádná data, bude nadřazená tabulka bez chyby zrušena. Pokud podřízená tabulka obsahuje data (pravděpodobně včetně dat, která odkazují na primární klíč nadřazené tabulky), bude to mít za následek chybu a tabulka nebude zrušena.
Takhle:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Výsledek:
Error: FOREIGN KEY constraint failed
Důvod, proč to takto funguje, je ten, že SQLite provádí implicitní DELETE FROM
operaci před upuštěním stolu. Pokud DELETE FROM
operace má za následek porušení cizího klíče, pak dostaneme chybu. Pokud ale v tabulce nejsou žádná data, pak jakékoli DELETE FROM
operace nepovede k porušení cizího klíče a tabulka může být zrušena.
Stručně řečeno, není to DROP TABLE
operace, která způsobuje narušení cizího klíče, je to implicitní DELETE FROM
operace.
Když cizí klíč používá ON DELETE CASCADE
Pokud je však omezení cizího klíče definováno pomocí ON DELETE CASCADE
, pak bude nadřazená tabulka zrušena a všechny řádky, které odkazují na sloupec primárního klíče této tabulky, budou odstraněny z podřízené tabulky.
Zde je příklad.
Vytvářejte tabulky a vkládejte data:
CREATE TABLE t11 (
c1 integer PRIMARY KEY AUTOINCREMENT
);
CREATE TABLE t12 (
c1 integer PRIMARY KEY AUTOINCREMENT,
c2 integer REFERENCES t11 (c1) ON DELETE CASCADE
);
INSERT INTO t11 VALUES (1);
INSERT INTO t12 VALUES (1, 1);
Vyberte data:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Zrušte nadřazenou tabulku a zkontrolujte všechny tabulky:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Vidíme, že t11
již neexistuje, ale t12
stále existuje.
Zkontrolujte cizí klíč na t12
:
sqlite> PRAGMA foreign_key_list(t12);
id seq table from to on_update on_delete match
-- --- ----- ---- -- --------- --------- -----
0 0 t11 c2 c1 NO ACTION CASCADE NONE
Ano, stále existuje a můžeme potvrdit, že má ON DELETE CASCADE
.
Vyberte data z t12
:
sqlite> SELECT * FROM t12;
sqlite>
Nejsou vráceny žádné řádky. Je to proto, že ON DELETE CASCADE
volba na cizím klíči zajistila, že řádek byl odstraněn při nadřazené tabulce (t11
) byl zrušen (nebo přesněji, když byla jeho data smazána pomocí implicitního DELETE FROM
operace před odhozením).
Vypuštění cizího klíče
SQLite ve skutečnosti nepodporuje vypouštění cizích klíčů. Normálně v SQL vypustíte cizí klíče pomocí ALTER TABLE
příkaz, ale ALTER TABLE
SQLite implementace neumožňuje zrušit omezení.
Existuje však způsob, jak se s touto situací vypořádat. Příklad naleznete v části Jak zahodit cizí klíč v SQLite.