Database
 sql >> Database >  >> RDS >> Database

COLONNA SQL DROP per principianti

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 o PRIMARY 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