sql >> Databáze >  >> RDS >> SQLite

SQLite DROP TABLE

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.


  1. Použití Excel VBA ke spuštění SQL dotazu

  2. Jak nakonfigurovat SELinux pro systémy založené na MySQL (MySQL/MariaDB Replication + Galera)

  3. Uživatelská oprávnění SQLite

  4. Tipy pro používání SQL Serveru se Salesforce SOQL