I SQL, om du vill ta bort en tabell från en databas, måste du använda DROP TABLE
uttalande.
Det förstör tabellen och all dess data.
Syntax
SQL-standardsyntaxen ser ut så här:
DROP TABLE <table name> <drop behavior>
Var:
är namnet på tabellen du vill släppa.
anger eventuella alternativ. Dessa kan vara antingenCASCADE
ellerRESTRICT
.
Vissa RDBMS accepterar även en valfri OM FINNS
argument som innebär att det inte returnerar ett fel om tabellen inte finns.
Vissa RDBMS:er (som MySQL och MariaDB) accepterar också en valfri TILLÄMPLIG
nyckelord för att säkerställa att endast tillfälliga tabeller tas bort.
Oracle accepterar också en PURGE
klausul, som rensar den från papperskorgen.
Exempel
Här är ett exempel att visa.
DROP TABLE t1;
Om du kör den koden försvinner tabellen som heter t1
och alla dess data.
OM FINNS Klausul
Här är ett exempel på hur du använder OM FINNS
sats för att kontrollera om tabellen redan finns.
DROP TABLE IF EXISTS t1;
Använder OM FINNS
säkerställer att vi inte får ett felmeddelande om tabellen inte finns.
Så här händer om vi tar bort OM FINNS
från uttalandet:
DROP TABLE t1;
Resultat:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Det är meddelandet som returneras av SQL Server. Ditt meddelande beror på vilket DBMS du använder.
Beroende främmande nycklar och vyer
Vissa RDBMS tillåter en valfri RESTRICT
eller CASCADE
nyckelord som anger vad som händer om tabellen har några främmande nycklar eller vyer som refererar till den.
RESTRICT
Alternativ
Här är ett exempel på hur du använder RESTRICT
när du försöker släppa en tabell som refereras av en främmande nyckel i en annan tabell:
DROP TABLE t1 RESTRICT;
Resultat:
cannot drop table t1 because other objects depend on it
Detta exempel gjordes med PostgreSQL. RESTRICT
är standardalternativet, så vi skulle ha fått samma resultat även om vi inte hade inkluderat RESTRICT
nyckelord.
CASCADE
Alternativ
Här är vad som händer om vi byter till CASCADE
när du försöker släppa samma tabell (som refereras av en främmande nyckel i en annan tabell):
DROP TABLE t1 CASCADE;
Resultat:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Detta tog bort den främmande nyckeln som hänvisade till vår t1
tabell. Den främmande nyckeln kallades t2_c2_fkey
.
Observera att den inte tappade tabellen som hade den främmande nyckeln. Den tappade bara den främmande nyckeln.
Om måltabellen (t1
) refererades av alla vyer, skulle hela vyn ha tagits bort.
Du behöver inte ange CASCADE
för att ta bort alla index, regler, utlösare eller begränsningar som finns för måltabellen. Dessa tas bort automatiskt, även när du använder standardalternativet (RESTRICT
).
MySQL och MariaDB
Vissa DBMS:er (som MySQL och MariaDB) accepterar RESTRICT
och CASCADE
sökord, men de gör ingenting. De tillhandahålls helt enkelt för enklare portabilitet mellan DBMS.
Oracle
Oracle har en något annorlunda syntax, CASCADE CONSTRAINTS
, vilket tar bort alla referensintegritetsbegränsningar som hänvisar till primära och unika nycklar i den släppta tabellen.
SQL-server
SQL Server stöder inte CASCADE
eller RESTRICT
nyckelord. Om tabellen har några beroenden av främmande nyckel måste du släppa dem innan du släpper tabellen, annars får du ett felmeddelande.
Men i SQL Server kan du släppa en tabell även om den refereras av en vy eller lagrad procedur. Därför bör du leta efter sådana referenser och uttryckligen släppa dem genom att använda DROP VIEW
eller SLÄPPPROCEDUR
.
SQLite
SQLite stöder inte CASCADE
eller RESTRICT
nyckelord.
Om måltabellen refereras av någon vy kommer tabellen fortfarande att tas bort (och vyn kommer att finnas kvar).
Om måltabellen refereras av några främmande nycklar, kommer resultatet att bero på om du har främmande nycklar aktiverade, och i så fall om det finns några data i den underordnade tabellen, och i så fall om den främmande nyckeln är definierad med PÅ DELETE CASCADE
.
Om du använder SQLite, se SQLite DROP TABLE
för ett exempel och diskussion om att ta bort en tabell som refereras av en främmande nyckel.
Släpp flera tabeller
Vissa RDBMS:er låter dig släppa flera tabeller från en enda DROP TABLE
uttalande.
Exempel:
DROP TABLE t11, t12;
RDBMS som stöder denna syntax inkluderar SQL Server, MySQL, MariaDB och PostgreSQL.
Men om du släpper en tabell som refereras av en främmande nyckel, och den främmande nyckeln förhindrar att den släpps, måste du lista den underordnade tabellen före den överordnade tabellen.
Till exempel, om jag kör ovanstående sats i SQL Server får jag följande felmeddelande:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
I det här fallet kan jag helt enkelt byta ordning på tabellerna i min DROP TABLE
uttalande:
DROP TABLE t12, t11;
I det här fallet fick jag faktiskt ett annat felmeddelande om att t12
finns inte.
Det här är vad jag fick:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Detta beror på att, även om det tidigare uttalandet inte kunde släppa t11
, lyckades den faktiskt ta bort t12
.
Och precis som en komedi av misstag kunde den den här gången släppa t11
men inte t12
.
Oavsett så har båda borden nu tagits bort.
Men om du får rätt beställning första gången bör du få ett meddelande så här:
Commands completed successfully.
Det TILLfälliga sökordet
Vissa RDBMS:er (som MySQL och MariaDB) accepterar en TILLÄMPLIG
nyckelord.
Det går mellan DROP
och TABELL
, så här:
DROP TEMPORARY TABLE t1;
Använda TEMPORARY
sökord säkerställer att du inte av misstag tappar en icke-tillfällig tabell när du försöker släppa en tillfällig tabell.
Den TILLÄMPLIGA
nyckelordet har följande effekter:
- Satsen släpps endast
TILLÄMPLIG
tabeller. - Utsatsen orsakar inte en implicit commit (med
DROP TABLE
utanTEMPORARY
nyckelordet begår automatiskt den aktuella aktiva transaktionen). - Inga åtkomsträttigheter är markerade. En
TIMPORÄR
Tabellen är endast synlig med den session som skapade den, så ingen kontroll behövs.
Utrensningsklausulen
Oracle har en valfri PURGE
klausul, som du kan använda om du vill släppa tabellen och frigöra utrymmet som är associerat med det i ett enda steg. Om du anger PURGE
, då placerar databasen inte tabellen och dess beroende objekt i papperskorgen.
Detta motsvarar att först släppa bordet och sedan tömma det från papperskorgen, men det låter dig spara ett steg i processen.
Observera att om du anger PURGE
, kommer du inte att kunna återställa tabellen.
Om du inte anger PURGE
, DROP
TABELL
uttalandet leder inte till att utrymme frigörs tillbaka till tabellutrymmet för användning av andra objekt, och utrymmet fortsätter att räknas mot användarens utrymmeskvot.