In SQL, se vuoi rimuovere una colonna da una tabella, devi usare ALTER TABLE
istruzione con DROP COLUMN
clausola.
Ciò rimuove la colonna e tutti i suoi dati.
Sintassi
La sintassi è questa:
ALTER TABLE table_name
DROP COLUMN column_name;
Alcuni RDBMS accettano un IF EXISTS
opzionale argomento che significa che non restituirà un errore se la colonna non esiste.
Alcuni RDBMS accettano anche CASCADE
opzionali e RESTRICT
argomenti, che specificano cosa fare se la colonna ha delle dipendenze. Vedi sotto per ulteriori informazioni su questo.
Esempio
Ecco un esempio da dimostrare.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Questo rimuove il ProductDescription
colonna dai Products
tabella.
Il IF EXISTS
Argomento
A seconda del tuo RDBMS, potresti essere in grado di utilizzare il IF EXISTS
argomento, che elimina condizionalmente la colonna solo se esiste già.
Il vantaggio di farlo è che non riceverai un errore se la colonna non esiste.
Esempio:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Limita la modifica
A seconda del tuo RDBMS, potresti essere in grado di utilizzare il CASCADE
e RESTRICT
argomenti per specificare cosa fare se la colonna ha dipendenze, come chiavi esterne o viste.
RESTRICT
è in genere il comportamento predefinito, quindi se non specifichi nessuno di questi argomenti, il DBMS rifiuterà di eliminare la colonna se sono presenti oggetti dipendenti.
Esempio:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Quando si utilizza l'istruzione sopra, se la colonna ha delle dipendenze, l'operazione di rilascio avrà esito negativo e verrà visualizzato un errore.
Ecco l'errore che ottengo in PostgreSQL quando provo a eliminare una tabella a cui fa riferimento una vista:
cannot drop column productdescription of table products because other objects depend on it
Cascate il cambiamento
Usando il CASCADE
opzione causerà l'eliminazione di tutti gli oggetti dipendenti.
Ecco cosa succede se cambio l'esempio precedente in CASCADE
:
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Risultato:
NOTICE: drop cascades to view vproducts Commands completed successfully
In questo caso, la colonna è stata eliminata e ho ricevuto un messaggio che spiegava che la vista si chiamava vproducts
è stato anche abbandonato.
CASCADE
e RESTRICT
sono supportati in PostgreSQL, ma non in SQL Server o MySQL. Entrambe le parole chiave possono essere utilizzate in MariaDB ma non hanno alcun effetto.
Oracle accetta un CASCADE CONSTRAINTS
clausola che elimina tutti i vincoli di chiave esterna che fanno riferimento alle chiavi primarie e univoche definite sulle colonne eliminate, nonché tutti i vincoli multicolonna definiti sulle colonne eliminate.
Rilascia più colonne
Alcuni RDBM ti consentono di eliminare più colonne all'interno di un singolo ALTER TABLE
dichiarazione. La sintassi varia tra RDBMS.
In SQL Server puoi semplicemente elencare ogni colonna, separata da una virgola:
ALTER TABLE t1
DROP COLUMN c1, c2;
In altri RDBMS (come MySQL e PostgreSQL), dovresti riscrivere DROP COLUMN
per ogni colonna:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Nota che questa sintassi è un'estensione di SQL e non è conforme allo standard SQL di avere un solo DROP
clausola per ALTER TABLE
dichiarazione.
Rilascia l'ultima colonna
Alcuni RDBM consentono di eliminare l'ultima colonna nella tabella, lasciando quindi una tabella vuota senza colonne. Questa è un'estensione dello standard SQL (che non consente tabelle a colonna zero).
Ad esempio, in PostgreSQL, ho usato la seguente istruzione per eliminare l'ultima colonna rimanente nella tabella
ALTER TABLE t1
DROP COLUMN c3;
Risultato:
Commands completed successfully
Ma in SQL Server, se faccio lo stesso:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Risultato:
Msg 4923, Level 16, State 1, Line 1 ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.
Si noti che, nonostante la formulazione di questo messaggio di errore, c3 non era l'unica colonna rimanente. In realtà c'erano tre colonne. Tuttavia, c3 sarebbe stato l'ultimo rimasto se gli altri due fossero stati eliminati. In questo caso, nessuna delle tre colonne è stata effettivamente eliminata.
In ogni caso, anche se avessi eliminato gli altri due, SQL Server si rifiuterebbe di eliminare l'ultimo.
MySQL si rifiuta anche di eliminare l'ultima colonna in una tabella.
Se la tua intenzione è quella di eliminare la tabella, usa DROP TABLE
.
Restrizioni per RDBMS
Sebbene il DROP COLUMN
di base la sintassi è abbastanza simile nella maggior parte dei principali RDBMS, ogni RDBMS tende ad avere le proprie restrizioni per quando una colonna verrà o non verrà eliminata.
Ecco alcune delle restrizioni di alcuni dei principali RDBMS.
SQL Server
Una colonna non può essere eliminata quando è:
- Utilizzato in un indice, sia come colonna chiave che come
INCLUDE
- Utilizzato in un
CHECK
,FOREIGN KEY
,UNIQUE
oPRIMARY KEY
vincolo. - Associato a un'impostazione predefinita definita con
DEFAULT
parola chiave o legato a un oggetto predefinito. - Legato a una regola.
Fonte per SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Se le colonne vengono eliminate da una tabella, le colonne vengono rimosse anche da qualsiasi indice di cui fanno parte. Se tutte le colonne che compongono un indice vengono eliminate, viene eliminato anche l'indice.
Fonte per MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Anche gli indici e i vincoli di tabella che coinvolgono la colonna verranno automaticamente eliminati.
Anche le statistiche multivariate che fanno riferimento alla colonna eliminata verranno rimosse se la rimozione della colonna fa sì che le statistiche contengano dati per una sola colonna.
Dovrai usare CASCADE
se qualcosa al di fuori della tabella dipende dalla colonna, ad esempio chiavi esterne o viste.
Fonte per PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite non supporta DROP COLUMN
sintassi. Non puoi eliminare una colonna in SQLite.
Se devi eliminare una colonna in SQLite, ti consigliamo di seguire la procedura in 12 passaggi consigliata nella documentazione di SQLite.
Fonte per SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Se la colonna fa parte di qualsiasi indice, la colonna verrà eliminata da essi, a meno che non si aggiunga contemporaneamente una nuova colonna con lo stesso nome. L'indice verrà eliminato se tutte le colonne dell'indice verranno eliminate. Se la colonna è stata utilizzata in una vista o in un attivatore, riceverai un errore al successivo accesso alla vista o al attivatore.
Da MariaDB 10.2.8, eliminando una colonna che fa parte di una multicolonna UNIQUE
vincolo non è consentito.
MariaDB accetta RESTRICT
e CASCADE
per rendere più semplice il porting da altri sistemi di database, ma in MariaDB non fanno nulla.
MariaDB 10.4.0 supporta DROP COLUMN
istantanea . DROP COLUMN
di una colonna indicizzata implicherebbe DROP INDEX
(e nel caso di un non UNIQUE
indice a più colonne, possibilmente ADD INDEX
). Questi non saranno consentiti con ALGORITHM=INSTANT
, ma a differenza di prima, possono essere consentiti con ALGORITHM=NOCOPY
.
Fonte per MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column