sql >> Database teknologi >  >> RDS >> SQLite

SQLite DROP TABEL

I SQLite kan du slippe en tabel med DROP TABLE erklæring.

Du kan eventuelt tilføje HVIS FINDER klausul for at undertrykke eventuelle fejl, der kan opstå, hvis tabellen ikke eksisterer.

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.


  1. Oracle ODP.Net og EF CodeFirst - SaveChanges-fejl

  2. Oprettelse af en tabel i enkeltbrugertilstand i postgres

  3. Ret "FEJL 1054 (42S22):Ukendt kolonne "..." i "ordre clause", når du bruger UNION i MySQL

  4. Datastyring med Python, SQLite og SQLAlchemy