Come DROP più colonne con una singola istruzione ALTER TABLE in SQL Server?


292

Vorrei scrivere un singolo comando SQL per eliminare più colonne da una singola tabella in un'unica ALTER TABLEistruzione.

Dalla documentazione ALTER TABLE di MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Specifica che il nome vincolo o nome_colonna viene rimosso dalla tabella. DROP COLUMN non è consentito se il livello di compatibilità è 65 o precedente. È possibile elencare più colonne e vincoli.

Dice che le colonne multiple possono essere elencate nell'istruzione ma la sintassi non mostra una virgola opzionale o qualsiasi cosa che possa anche suggerire la sintassi.

Come devo scrivere il mio SQL per eliminare più colonne in un'istruzione (se possibile)?

Risposte:


431

Per SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

La sintassi è

DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ] 

Per MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

o come questo 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 La parola COLUMNè facoltativa e può essere omessa, ad eccezione di RENAME COLUMN(per distinguere un'operazione di ridenominazione di colonna dall'operazione di ridenominazione di RENAMEtabelle). Maggiori informazioni qui .


1
@Gweebz - Presumo che l'errore che hai avuto fosse legato all'utilizzo della colonna. La colonna può essere utilizzata in un vincolo, indice o un'altra colonna calcolata.
Alex Aza,

Precisamente; la seconda colonna che avevo era usata in un indice. Ho lasciato cadere quell'indice e la mia dichiarazione DROP ha funzionato perfettamente dopo.
Jesse Webb,

@jeicam - Probabilmente sarebbe successo perché 1 delle colonne che stai cercando di eliminare potrebbe essere una chiave primaria.
Benny,

196

Riassumendo

Oracle :

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL Server :

ALTER TABLE table_name DROP COLUMN column_name1, column_name2

MySQL :

ALTER TABLE table_name DROP column_name1, DROP column_name2;

PostgreSQL

ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2;

Sii consapevole

DROP COLUMNnon rimuove fisicamente i dati per alcuni DBMS. Ad esempio per MS SQL. Per tipi di lunghezza fissa ( int , numerico , float , datetime , uniqueidentifier ecc.) Lo spazio viene consumato anche per i record aggiunti dopo l'eliminazione delle colonne. Per sbarazzarsi dello spazio sprecato fare ALTER TABLE ... REBUILD.


3
Per PostgreSQL puoi persino omettere le COLUMNparole chiave come in MySql.
Artem Novikov,

1
Puoi anche usare lo stesso formato per MySQL di MS SQL e Postgre SQL: ALTER TABLE table_name DROP COLUMN nome_colonna1, nome_colonna2;
jciloa,

Grazie per aver esteso le risposte ad altri fornitori di DB!
KJP,

39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Tenere presente che DROP COLUMN non rimuove fisicamente i dati e per tipi di lunghezza fissa (int, numerico, float, datetime, uniqueidentifier ecc.) Lo spazio viene utilizzato anche per i record aggiunti dopo l'eliminazione delle colonne. Per sbarazzarsi dello spazio sprecato fare ALTER TABLE ... REBUILD.


11
+1 per la nota relativa alle dimensioni del tavolo e che richiede un REVISIONE. Potete fornire un collegamento alla documentazione come riferimento?
Jesse Webb,

2
Proprio lì nella
tabella

4
Ho parlato con il mio DBA di fare un REVISIONATO e ha detto che se il tavolo avesse un indice cluster (come il mio), avrei potuto semplicemente correre ALTER INDEX PK_IndexName ON TableName REBUILDe avrebbe recuperato lo spazio. Questo è in qualche modo descritto qui: msdn.microsoft.com/en-us/library/ms189858.aspx nella sezione "Ricostruzione di un indice".
Jesse Webb,

1
Chiunque può far luce su PERCHÉ questo sarebbe implementato in questo modo? Se ho lasciato cadere la colonna, mi aspetto che gli indici, i dati e tutto ciò che è costruito su quella colonna scompaiano. Lasciare lo spazio sprecato senza avvertire sembra una cattiva pratica o mi sto perdendo qualcosa?
DanteTheSmith

13

Potrebbe essere tardi, ma condividendolo per i nuovi utenti che visitano questa domanda. Per rilasciare più colonne la sintassi effettiva è

alter table tablename drop column col1, drop column col2 , drop column col3 ....

Quindi per ogni colonna devi specificare "drop column" in Mysql 5.0.45.


Questa è sintassi errata. Usa: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme,

1
@Graeme la sintassi è corretta, l'ho testata e funziona, se uso: ALTER TABLE Test DROP COLUMN c1, c2; Mysql genera un errore. ... vicino c2
Tom Mwenda il

6
@TomBikiNurse La domanda ha un riferimento MSDN, quindi è stato ipotizzato che l'SQL in questione sia correlato a MS SQL Server e non a MySQL
Surya Pratap,

questa è la sintassi reale. le risposte meglio votate sono sbagliate.
Vardumper,

@SuryaPratap La domanda menziona "my SQL" nell'ultimo paragrafo.
Eterno

4

La sintassi specificata da Microsoft per l'eliminazione di una colonna di un'istruzione ALTER è questa

 DROP 
 {
     [ CONSTRAINT ] 
     { 
          constraint_name 
          [ WITH 
           ( <drop_clustered_constraint_option> [ ,...n ] ) 
          ] 
      } [ ,...n ]
      | COLUMN 
      {
          column_name 
      } [ ,...n ]
 } [ ,...n ]

Si noti che [, ... n] appare sia dopo il nome della colonna sia alla fine dell'intera clausola di rilascio. Ciò significa che ci sono due modi per eliminare più colonne. Puoi farlo sia:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

o questo

ALTER TABLE TableName
    DROP 
        COLUMN Column1,
        COLUMN Column2,
        COLUMN Column3

Questa seconda sintassi è utile se si desidera combinare il rilascio di una colonna con il rilascio di un vincolo:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Quando si eliminano le colonne, SQL Sever non recupera lo spazio occupato dalle colonne rilasciate. Per i tipi di dati che sono memorizzati in linea nelle righe (ad esempio int), potrebbe persino occupare spazio sulle nuove righe aggiunte dopo l'istruzione alter. Per ovviare a questo è necessario creare un indice cluster sulla tabella o ricostruire l'indice cluster se ne ha già uno. La ricostruzione dell'indice può essere eseguita con un comando REBUILD dopo aver modificato la tabella. Ma attenzione, questo può essere lento su tavoli molto grandi. Per esempio:

ALTER TABLE Test
    REBUILD;

3

Per MySQL (versione 5.6), non è possibile eseguire il rilascio di più colonne con un singolo dropstato ma piuttosto più dropstati:

mysql> alter table test2 drop column (c1,c2,c3);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(c1,c2,c3)' at line 1
mysql> alter table test2 drop column c1,c2,c3;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c2,c3' at line 1
mysql> alter table test2 drop column c1, drop column c2, drop c3;
Query OK, 0 rows affected (0.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 

A proposito, drop <col_name>è abbreviato per drop column <col_name>come puoi vedere drop c3dall'alto.


2

Se è solo una colonna per eliminare la sintassi di seguito funziona

ALTER TABLE tablename DROP COLUMN column1;

Per eliminare più colonne, utilizzando la funzione DROP COLUMNnon funziona, funziona la sintassi seguente

ALTER TABLE tablename DROP (column1, column2, column3......);


1
alter table tablename drop (column1, column2, column3......);

Questa è sintassi errata. Usa: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme,

1

Generico:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Per esempio:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;

0

questa query modificherà la colonna multipla testarlo.

create table test(a int,B int,C int);

alter table test drop(a,B);

Questa è sintassi errata. Usa: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme,

0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

per MySQL DB.

Oppure puoi aggiungere qualche colonna mentre si altera nella stessa riga:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.