sql >> Database >  >> RDS >> SQLite

SQLite DROP TABLE

In SQLite kun je een tabel neerzetten met de DROP TABLE verklaring.

U kunt optioneel de IF EXISTS . toevoegen clausule om eventuele fouten te onderdrukken die kunnen optreden als de tabel niet bestaat.

Als er naar de tabel wordt verwezen door een externe sleutel, zijn er een paar dingen waar u op moet letten.

Voorbeeld

Hier is een voorbeeld om de eenvoudigste manier te demonstreren om een ​​tabel in SQLite te verwijderen:

DROP TABLE t1;

Dit laat de tabel met de naam t1 vallen .

U kunt optioneel de tabelnaam vooraf laten gaan door de schemanaam.

De IF EXISTS gebruiken Clausule

U kunt de IF EXISTS . gebruiken clausule om eventuele fouten te onderdrukken die kunnen optreden in het geval dat de tabel niet bestaat.

DROP TABLE IF EXISTS t2;

Als we de IF EXISTS . verwijderen clausule, en voer dat opnieuw uit, we krijgen een foutmelding.

Voorbeeld:

DROP TABLE t2;

Resultaat:

Error: no such table: t2 

Buitenlandse sleutel &afhankelijkheden bekijken

SQLite ondersteunt de CASCADE . niet en RESTRICT trefwoorden, die zijn opgenomen in de SQL-standaard en worden ondersteund door enkele andere RDBMS'en (zoals PostgreSQL). Deze trefwoorden zijn ontworpen om aan te geven wat er moet gebeuren als de doeltabel afhankelijkheden heeft (zoals een weergave of externe sleutel die naar de tabel verwijst).

Aangezien SQLite deze trefwoorden niet ondersteunt, is hier de manier waarop SQLite omgaat met views en externe sleutels wanneer u een tabel probeert neer te zetten.

SQLite negeert alle afhankelijke views. Met andere woorden, het gaat door en laat de tafel vallen, zelfs als er een weergave is die ernaar verwijst.

Wat betreft buitenlandse sleutels...

Ten eerste zijn externe sleutels standaard uitgeschakeld in SQLite. Dus tenzij u ze inschakelt, hebben externe sleutels die verwijzen naar de doeltabel geen invloed op het verwijderen van de doeltabel. Met andere woorden, de tafel valt weg.

Als externe sleutels zijn ingeschakeld in uw sessie, zullen ze alleen voorkomen dat de tabel wordt verwijderd als er gegevens zijn die die externe sleutel schenden. Als uw onderliggende tabel geen gegevens bevat, wordt de bovenliggende tabel zonder fouten verwijderd. Als de onderliggende tabel gegevens bevat (waarschijnlijk inclusief gegevens die verwijzen naar de primaire sleutel van de bovenliggende tabel), resulteert dit in een fout en wordt de tabel niet verwijderd.

Zoals dit:

PRAGMA foreign_keys = ON;
DROP TABLE t1;

Resultaat:

Error: FOREIGN KEY constraint failed 

De reden dat het zo werkt, is omdat SQLite een impliciete DELETE FROM . uitvoert bediening voordat u de tafel laat vallen. Als de DELETE FROM bewerking resulteert in een schending van een externe sleutel, dan krijgen we de fout. Maar als er geen gegevens in de tabel staan, dan is elke DELETE FROM bewerking zal niet resulteren in een schending van een externe sleutel en de tabel kan worden verwijderd.

Kortom, het is niet de DROP TABLE bewerking die schendingen van buitenlandse sleutels veroorzaakt, is het de impliciete DELETE FROM bediening.

Als de externe sleutel ON DELETE CASCADE gebruikt

Als de externe sleutelbeperking echter is gedefinieerd met ON DELETE CASCADE , dan wordt de bovenliggende tabel verwijderd en alle rijen die verwijzen naar de primaire sleutelkolom van die tabel worden verwijderd in de onderliggende tabel.

Hier is een voorbeeld.

Tabellen maken en gegevens invoegen:

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);

Selecteer gegevens:

sqlite> SELECT * FROM t11;
c1
--
1 
sqlite> SELECT * FROM t12;
c1  c2
--  --
1   1 

Laat de bovenliggende tabel vallen en bekijk alle tabellen:

sqlite> DROP TABLE t11;
sqlite> .tables
t12

We kunnen zien dat t11 bestaat niet meer, maar t12 bestaat nog steeds.

Controleer de externe sleutel op 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, dat bestaat nog steeds, en we kunnen bevestigen dat het ON DELETE CASCADE heeft .

Selecteer gegevens uit t12 :

sqlite> SELECT * FROM t12;
sqlite> 

Er worden geen rijen geretourneerd. Dit komt omdat de ON DELETE CASCADE optie op de externe sleutel zorgde ervoor dat de rij werd verwijderd toen de bovenliggende tabel (t11 ) is verwijderd (of beter gezegd, toen de gegevens werden verwijderd via de impliciete DELETE FROM operatie voordat deze wordt neergezet).

Een externe sleutel laten vallen

SQLite ondersteunt niet echt het laten vallen van externe sleutels. Normaal gesproken laat je in SQL buitenlandse sleutels vallen met de ALTER TABLE statement, maar SQLite's ALTER TABLE implementatie staat het niet toe om beperkingen te laten vallen.

Er is echter een manier om met deze situatie om te gaan. Zie Hoe u een externe sleutel in SQLite kunt plaatsen voor een voorbeeld.


  1. krijg de JOIN-tabel als een reeks resultaten met PostgreSQL/NodeJS

  2. PostgreSQL:automatisch verhogen op basis van unieke beperking met meerdere kolommen

  3. BESTEL OP DATUM met eerst NULLS en vervolgens de meest recente datums

  4. Kan ik in MySQL referentiële integriteitscontroles uitstellen tot commit?