I SQLite kan du slippe en tabel med DROP TABLE
erklæring.
Du kan eventuelt tilføje
Hvis tabellen refereres af en fremmednøgle, er der et par ting, du skal være opmærksom på.
Eksempel
Her er et eksempel for at demonstrere den enkleste måde at droppe en tabel i SQLite:
DROP TABLE t1;
Dette fjerner tabellen kaldet t1
.
Du kan valgfrit forudsætte tabelnavnet med skemanavnet.
Brug af HVIS FINNES
Klausul
Du kan bruge koden HVIS FINNES
klausul for at undertrykke eventuelle fejl, der måtte opstå i tilfælde af, at tabellen ikke eksisterer.
DROP TABLE IF EXISTS t2;
Hvis vi fjerner IF EXISTS
klausul, og køre det igen, får vi en fejl.
Eksempel:
DROP TABLE t2;
Resultat:
Error: no such table: t2
Udenlandsk nøgle og visningsafhængigheder
SQLite understøtter ikke CASCADE
og RESTRICT
nøgleord, som er inkluderet i SQL-standarden og understøttes af nogle andre RDBMS'er (såsom PostgreSQL). Disse nøgleord er designet til at specificere, hvad der skal gøres, når måltabellen har afhængigheder (såsom en visning eller fremmednøgle, der refererer til tabellen).
Da SQLite ikke understøtter disse søgeord, er her, hvordan SQLite håndterer visninger og fremmednøgler, når du forsøger at droppe en tabel.
SQLite ignorerer alle afhængige visninger. Med andre ord går den videre og taber tabellen, selvom der er en visning, der refererer til den.
Hvad angår fremmednøgler...
For det første er fremmednøgler deaktiveret som standard i SQLite. Så medmindre du aktiverer dem, vil enhver fremmednøgle, der refererer til måltabellen, ikke have nogen indflydelse på udeladelsen af måltabellen. Med andre ord vil tabellen blive droppet.
Hvis fremmednøgler er aktiveret i din session, vil de kun forhindre tab af tabellen, hvis der er data, der vil krænke den fremmednøgle. Hvis din underordnede tabel ikke indeholder nogen data, vil den overordnede tabel blive slettet uden fejl. Hvis den underordnede tabel indeholder data (formodentlig inklusive data, der refererer til den overordnede tabels primære nøgle), vil dette resultere i en fejl, og tabellen vil ikke blive slettet.
Sådan:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Resultat:
Error: FOREIGN KEY constraint failed
Grunden til at det virker sådan er fordi SQLite udfører en implicit DELETE FROM
operation, før du taber bordet. Hvis DELETE FROM
operation resulterer i en fremmednøglebrud, så får vi fejlen. Men hvis der ikke er nogen data i tabellen, så enhver DELETE FROM
handling vil ikke resultere i en overtrædelse af en fremmednøgle, og tabellen kan slettes.
Kort sagt, det er ikke DROP TABLE
operation, der forårsager enhver overtrædelse af fremmednøgle, er det den implicitte DELETE FROM
operation.
Når den fremmede nøgle bruger ON DELETE CASCADE
Men hvis den fremmede nøgle-begrænsning er defineret med ON DELETE CASCADE
, så vil den overordnede tabel blive slettet, og alle rækker, der refererer til tabellens primære nøglekolonne, slettes i den underordnede tabel.
Her er et eksempel.
Opret tabeller og indsæt 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);
Vælg data:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Slip den overordnede tabel og gennemgå alle tabeller:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Vi kan se, at t11
eksisterer ikke længere, men t12
eksisterer stadig.
Tjek fremmednøglen på 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
Ja, det eksisterer stadig, og vi kan bekræfte, at det har ON DELETE CASCADE
.
Vælg data fra t12
:
sqlite> SELECT * FROM t12;
sqlite>
Ingen rækker returneres. Dette skyldes, at ON SLET CASCADE
mulighed på fremmednøglen sikrede, at rækken blev slettet, når den overordnede tabel (t11
) blev slettet (eller mere præcist, da dens data blev slettet via den implicitte DELETE FROM
operation, før den tabes).
Slip en fremmednøgle
SQLite understøtter faktisk ikke tab af fremmednøgler. Normalt i SQL slipper du fremmednøgler med ALTER TABLE
sætning, men SQLites ALTER TABLE
implementering tillader ikke at slippe begrænsninger.
Der er dog en måde at håndtere denne situation på. Se hvordan man slipper en fremmednøgle i SQLite for et eksempel.