In SQL, se vuoi rimuovere una tabella da un database, devi usare il DROP TABLE
dichiarazione.
Ciò distrugge la tabella e tutti i suoi dati.
Sintassi
La sintassi standard SQL è la seguente:
DROP TABLE <table name> <drop behavior>
Dove:
<table name>
è il nome della tabella che vuoi eliminare.<drop behavior>
specifica qualsiasi opzione. Questi possono essereCASCADE
oRESTRICT
.
Alcuni RDBMS accettano anche un IF EXISTS
opzionale argomento che significa che non restituirà un errore se la tabella non esiste.
Alcuni RDBMS (come MySQL e MariaDB) accettano anche un TEMPORARY
opzionale parola chiave per garantire che vengano eliminate solo le tabelle temporanee.
Oracle accetta anche un PURGE
clausola, che lo elimina dal cestino.
Esempio
Ecco un esempio da dimostrare.
DROP TABLE t1;
L'esecuzione di quel codice rilascia la tabella chiamata t1
e tutti i suoi dati.
Il IF EXISTS
Clausola
Ecco un esempio di utilizzo di IF EXISTS
clausola per verificare se la tabella esiste già.
DROP TABLE IF EXISTS t1;
Usando IF EXISTS
assicura che non riceviamo un errore se la tabella non esiste.
Ecco cosa succede se rimuoviamo IF EXISTS
dalla dichiarazione:
DROP TABLE t1;
Risultato:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Questo è il messaggio restituito da SQL Server. Il tuo messaggio dipenderà dal DBMS che stai utilizzando.
Chiavi esterne e viste dipendenti
Alcuni RDBMS consentono un RESTRICT
opzionale o CASCADE
parola chiave che specifica cosa succede se la tabella ha chiavi esterne o viste che fanno riferimento ad essa.
Il RESTRICT
Opzione
Ecco un esempio di utilizzo di RESTRICT
quando si tenta di eliminare una tabella a cui fa riferimento una chiave esterna in un'altra tabella:
DROP TABLE t1 RESTRICT;
Risultato:
cannot drop table t1 because other objects depend on it
Questo esempio è stato eseguito utilizzando PostgreSQL. RESTRICT
è l'opzione predefinita, quindi avremmo ricevuto lo stesso risultato anche se non avessimo incluso il RESTRICT
parola chiave.
Il CASCADE
Opzione
Ecco cosa succede se passiamo a CASCADE
quando si tenta di eliminare la stessa tabella (a cui fa riferimento una chiave esterna in un'altra tabella):
DROP TABLE t1 CASCADE;
Risultato:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Questo ha eliminato la chiave esterna che faceva riferimento al nostro t1
tavolo. La chiave esterna è stata chiamata t2_c2_fkey
.
Nota che non ha eliminato la tabella che aveva la chiave esterna. Ha eliminato solo la chiave esterna.
Se la tabella di destinazione (t1
) è stato referenziato da qualsiasi vista, l'intera vista sarebbe stata eliminata.
Non è necessario specificare CASCADE
per eliminare indici, regole, trigger o vincoli esistenti per la tabella di destinazione. Questi vengono eliminati automaticamente, anche quando si utilizza l'opzione predefinita (RESTRICT
).
MySQL e MariaDB
Alcuni DBMS (come MySQL e MariaDB) accettano RESTRICT
e CASCADE
parole chiave, ma non fanno nulla. Sono forniti semplicemente per una più facile portabilità tra DBMS.
Oracolo
Oracle ha una sintassi leggermente diversa, CASCADE CONSTRAINTS
, che elimina tutti i vincoli di integrità referenziale che fanno riferimento alle chiavi primarie e univoche nella tabella eliminata.
SQL Server
SQL Server non supporta il CASCADE
o RESTRICT
parole chiave. Se la tabella ha dipendenze da chiavi esterne, dovrai eliminarle prima di eliminare la tabella, altrimenti riceverai un errore.
Tuttavia, in SQL Server è possibile eliminare una tabella anche se è referenziata da una vista o da una stored procedure. Pertanto, dovresti verificare la presenza di tali riferimenti e rilasciarli esplicitamente utilizzando DROP VIEW
o DROP PROCEDURE
.
SQLite
SQLite non supporta CASCADE
o RESTRICT
parole chiave.
Se la tabella di destinazione è referenziata da qualsiasi vista, la tabella verrà comunque eliminata (e la vista rimarrà).
Se la tabella di destinazione è referenziata da chiavi esterne, il risultato dipenderà dal fatto che le chiavi esterne siano abilitate e, in tal caso, dalla presenza di dati nella tabella figlio e, in tal caso, dal fatto che la chiave esterna sia definita o meno con ON DELETE CASCADE
.
Se usi SQLite, consulta SQLite DROP TABLE
per un esempio e una discussione sull'eliminazione di una tabella a cui fa riferimento una chiave esterna.
Elimina più tabelle
Alcuni RDBMS ti consentono di eliminare più tabelle da un singolo DROP TABLE
dichiarazione.
Esempio:
DROP TABLE t11, t12;
Gli RDBMS che supportano questa sintassi includono SQL Server, MySQL, MariaDB e PostgreSQL.
Tuttavia, se stai eliminando una tabella a cui fa riferimento una chiave esterna e tale chiave esterna ne impedisce l'eliminazione, dovrai elencare la tabella figlio prima della tabella padre.
Ad esempio, se eseguo l'istruzione precedente in SQL Server, ottengo il seguente errore:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
In questo caso, posso semplicemente cambiare l'ordine delle tabelle nel mio DROP TABLE
dichiarazione:
DROP TABLE t12, t11;
In realtà, in questo caso, ho ricevuto un altro errore che mi diceva che t12
non esiste.
Ecco cosa ho ottenuto:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Questo perché, anche se l'istruzione precedente non poteva eliminare t11
, è riuscito infatti a eliminare t12
.
E proprio come una commedia degli errori, questa volta è stato in grado di rilasciare t11
ma non t12
.
Indipendentemente da ciò, ora entrambe le tabelle sono state eliminate.
Ma se ricevi l'ordine corretto la prima volta, dovresti ricevere un messaggio come questo:
Commands completed successfully.
La parola chiave TEMPORANEA
Alcuni RDBMS (come MySQL e MariaDB) accettano un TEMPORARY
parola chiave.
Va tra DROP
e TABLE
, in questo modo:
DROP TEMPORARY TABLE t1;
Usando il TEMPORARY
parola chiave ti assicurerà di non eliminare accidentalmente una tabella non temporanea quando tenti di eliminare una tabella temporanea.
Il TEMPORARY
la parola chiave ha i seguenti effetti:
- L'istruzione elimina solo
TEMPORARY
tabelle. - L'istruzione non provoca un commit implicito (usando
DROP TABLE
senza ilTEMPORARY
parola chiave impegna automaticamente la transazione attiva corrente). - Nessun diritto di accesso è verificato. Un
TEMPORARY
table è visibile solo con la sessione che l'ha creata, quindi non è necessario alcun controllo.
La clausola di eliminazione
Oracle ha un PURGE
opzionale clausola, che puoi utilizzare se vuoi eliminare la tabella e liberare lo spazio ad essa associato in un unico passaggio. Se specifichi PURGE
, il database non inserisce la tabella e gli oggetti dipendenti nel cestino.
Ciò equivale a eliminare prima il tavolo e poi eliminarlo dal cestino, ma ti consente di salvare un passaggio nel processo.
Nota che se specifichi PURGE
, non potrai recuperare il tavolo.
Se non specifichi PURGE
, il DROP
TABLE
istruzione non comporta il rilascio di spazio nel tablespace per l'utilizzo da parte di altri oggetti e lo spazio continua a contare per la quota di spazio dell'utente.