Als u in SQL een tabel uit een database wilt verwijderen, moet u de DROP TABLE
gebruiken verklaring.
Dat vernietigt de tabel en al zijn gegevens.
Syntaxis
De standaardsyntaxis van SQL gaat als volgt:
DROP TABLE <table name> <drop behavior>
Waar:
<table name>
is de naam van de tafel die u wilt laten vallen.<drop behavior>
geeft eventuele opties aan. Dit kunnen ofwelCASCADE
. zijn ofRESTRICT
.
Sommige RDBMS'en accepteren ook een optionele IF EXISTS
argument, wat betekent dat er geen fout wordt geretourneerd als de tabel niet bestaat.
Sommige RDBMS'en (zoals MySQL en MariaDB) accepteren ook een optionele TEMPORARY
zoekwoord om ervoor te zorgen dat alleen tijdelijke tabellen worden verwijderd.
Oracle accepteert ook een PURGE
clausule, die het uit de prullenbak verwijdert.
Voorbeeld
Hier is een voorbeeld om te demonstreren.
DROP TABLE t1;
Als je die code uitvoert, wordt de tabel met de naam t1
drops en al zijn gegevens.
De IF EXISTS
Clausule
Hier is een voorbeeld van het gebruik van de IF EXISTS
clausule om te controleren of de tabel al bestaat.
DROP TABLE IF EXISTS t1;
Gebruik IF EXISTS
zorgt ervoor dat we geen foutmelding krijgen als de tabel niet bestaat.
Dit is wat er gebeurt als we IF EXISTS
verwijderen uit de verklaring:
DROP TABLE t1;
Resultaat:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Dat is het bericht dat wordt geretourneerd door SQL Server. Uw bericht is afhankelijk van het DBMS dat u gebruikt.
Afhankelijke externe sleutels en weergaven
Sommige RDBMS'en staan een optionele RESTRICT
toe of CASCADE
trefwoord dat specificeert wat er gebeurt als de tabel externe sleutels of views heeft die ernaar verwijzen.
De RESTRICT
Optie
Hier is een voorbeeld van het gebruik van RESTRICT
wanneer u probeert een tabel te verwijderen waarnaar wordt verwezen door een externe sleutel in een andere tabel:
DROP TABLE t1 RESTRICT;
Resultaat:
cannot drop table t1 because other objects depend on it
Dit voorbeeld is gedaan met PostgreSQL. RESTRICT
is de standaardoptie, dus we zouden hetzelfde resultaat hebben gekregen, zelfs als we de RESTRICT
niet hadden opgenomen zoekwoord.
De CASCADE
Optie
Dit is wat er gebeurt als we overschakelen naar CASCADE
wanneer u probeert dezelfde tabel te verwijderen (waarnaar wordt verwezen door een externe sleutel in een andere tabel):
DROP TABLE t1 CASCADE;
Resultaat:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Dit liet de externe sleutel vallen die verwees naar onze t1
tafel. De refererende sleutel heette t2_c2_fkey
.
Merk op dat het de tafel met de externe sleutel niet liet vallen. Het liet alleen de externe sleutel vallen.
Als de doeltabel (t1
) werd verwezen door weergaven, zou de hele weergave zijn verwijderd.
U hoeft CASCADE
niet op te geven om indexen, regels, triggers of beperkingen die voor de doeltabel bestaan, te verwijderen. Deze worden automatisch verwijderd, zelfs bij gebruik van de standaardoptie (RESTRICT
).
MySQL en MariaDB
Sommige DBMS'en (zoals MySQL en MariaDB) accepteren de RESTRICT
en CASCADE
trefwoorden, maar ze doen niets. Ze zijn eenvoudigweg bedoeld om de overdraagbaarheid tussen DBMS'en te vergemakkelijken.
Oracle
Oracle heeft een iets andere syntaxis, CASCADE CONSTRAINTS
, die alle referentiële integriteitsbeperkingen laat vallen die verwijzen naar primaire en unieke sleutels in de verwijderde tabel.
SQL-server
SQL Server ondersteunt de CASCADE
. niet of RESTRICT
trefwoorden. Als de tabel afhankelijk is van externe sleutels, moet u deze verwijderen voordat u de tabel verwijdert, anders krijgt u een foutmelding.
In SQL Server kunt u echter een tabel neerzetten, zelfs als ernaar wordt verwezen door een weergave of opgeslagen procedure. Controleer daarom op dergelijke verwijzingen en verwijder ze expliciet met DROP VIEW
of DROP PROCEDURE
.
SQLite
SQLite ondersteunt de CASCADE
. niet of RESTRICT
trefwoorden.
Als er naar de doeltabel wordt verwezen door weergaven, wordt de tabel nog steeds verwijderd (en blijft de weergave behouden).
Als er naar de doeltabel wordt verwezen door externe sleutels, hangt de uitkomst ervan af of u externe sleutels hebt ingeschakeld, en zo ja, of er gegevens in de onderliggende tabel zijn, en zo ja, of de externe sleutel al dan niet is gedefinieerd met ON DELETE CASCADE
.
Als u SQLite gebruikt, zie SQLite DROP TABLE
voor een voorbeeld en bespreking van het verwijderen van een tabel waarnaar wordt verwezen door een externe sleutel.
Meerdere tabellen laten vallen
Met sommige RDBMS'en kunt u meerdere tabellen verwijderen uit een enkele DROP TABLE
verklaring.
Voorbeeld:
DROP TABLE t11, t12;
De RDBMS'en die deze syntaxis ondersteunen, zijn onder meer SQL Server, MySQL, MariaDB en PostgreSQL.
Als u echter een tabel verwijdert waarnaar wordt verwezen door een externe sleutel en die externe sleutel voorkomt dat deze wordt verwijderd, moet u de onderliggende tabel vóór de bovenliggende tabel weergeven.
Als ik bijvoorbeeld de bovenstaande instructie in SQL Server uitvoer, krijg ik de volgende foutmelding:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
In dit geval kan ik eenvoudig de volgorde van de tabellen in mijn DROP TABLE
. wijzigen verklaring:
DROP TABLE t12, t11;
In dit geval kreeg ik eigenlijk nog een foutmelding die me vertelde dat t12
bestaat niet.
Dit is wat ik heb:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Dit komt omdat, hoewel de vorige instructie t11
. niet kon laten vallen, , het was in feite succesvol bij het laten vallen van t12
.
En net als een komedie van fouten, kon het deze keer t11
. laten vallen maar niet t12
.
Hoe dan ook, beide tafels zijn nu verwijderd.
Maar als je de bestelling de eerste keer goed krijgt, zou je een bericht als dit moeten ontvangen:
Commands completed successfully.
Het TIJDELIJKE trefwoord
Sommige RDBMS'en (zoals MySQL en MariaDB) accepteren een TEMPORARY
zoekwoord.
Het gaat tussen DROP
en TABLE
, zoals dit:
DROP TEMPORARY TABLE t1;
De TEMPORARY
. gebruiken trefwoord zorgt ervoor dat u niet per ongeluk een niet-tijdelijke tafel laat vallen wanneer u probeert een tijdelijke tafel te verwijderen.
De TEMPORARY
zoekwoord heeft de volgende effecten:
- De instructie daalt alleen
TEMPORARY
tabellen. - De instructie veroorzaakt geen impliciete commit (met behulp van
DROP TABLE
zonder deTEMPORARY
trefwoord begaat automatisch de huidige actieve transactie). - Er zijn geen toegangsrechten aangevinkt. Een
TEMPORARY
tabel is alleen zichtbaar met de sessie die deze heeft gemaakt, dus er is geen controle nodig.
De zuiveringsclausule
Oracle heeft een optionele PURGE
clausule, die u kunt gebruiken als u de tabel wilt verwijderen en de bijbehorende ruimte in één stap wilt vrijgeven. Als u PURGE
opgeeft , dan plaatst de database de tabel en de afhankelijke objecten niet in de prullenbak.
Dit komt overeen met het eerst laten vallen van de tafel en deze vervolgens uit de prullenbak verwijderen, maar het bespaart u één stap in het proces.
Merk op dat als u PURGE
opgeeft, , kunt u de tabel niet herstellen.
Als u PURGE
niet opgeeft , de DROP
TABLE
statement resulteert niet in het teruggeven van ruimte aan de tablespace voor gebruik door andere objecten, en de ruimte blijft meetellen voor het ruimtequotum van de gebruiker.