Como soltar várias colunas com uma única instrução ALTER TABLE no SQL Server?

292

Eu gostaria de escrever um único comando SQL para eliminar várias colunas de uma única tabela em uma ALTER TABLEinstrução.

Da documentação ALTER TABLE do MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Especifica que constraint_name ou column_name é removido da tabela. DROP COLUMN não é permitido se o nível de compatibilidade for 65 ou anterior. Várias colunas e restrições podem ser listadas.

Ele diz que várias colunas podem ser listadas na declaração, mas a sintaxe não mostra uma vírgula opcional ou qualquer coisa que possa sugerir a sintaxe.

Como devo escrever meu SQL para soltar várias colunas em uma instrução (se possível)?

Jesse Webb
fonte

Respostas:

431

Para SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

A sintaxe é

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

Para o MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

ou assim 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 A palavra COLUMNé opcional e pode ser omitida, exceto RENAME COLUMN(para distinguir uma operação de renomeação de colunas da operação de renomeação de RENAMEtabelas). Mais informações aqui .

Alex Aza
fonte
1
@ Gweebz - Presumo que o erro que você teve foi relacionado ao uso da coluna. A coluna pode ser usada em uma restrição, índice ou outra coluna calculada.
precisa
Precisamente; a segunda coluna que eu tinha foi usada em um índice. Larguei esse índice e minha declaração DROP funcionou perfeitamente depois disso.
perfil completo de Jesse Webb
@jeicam - Isso teria acontecido provavelmente porque, uma das colunas que você está tentando soltar pode ser uma chave primária.
Benny
196

Resumindo

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;

Estar ciente

DROP COLUMNnão remove fisicamente os dados de alguns DBMS. Por exemplo, para MS SQL. Para tipos de comprimento fixo ( int , numérico , flutuante , data e hora , identificador exclusivo etc), o espaço é consumido mesmo para os registros adicionados depois que as colunas foram descartadas. Para se livrar do espaço desperdiçado, faça ALTER TABLE ... REBUILD.

Denis Rozhnev
fonte
3
Para o PostgreSQL, você pode até omitir COLUMNpalavras-chave como no MySql.
Artem Novikov
1
Você também pode usar o mesmo formato para MySQL e MS SQL e Postgre SQL: ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
Jciloa
Obrigado por expandir as respostas para outros fornecedores de banco de dados!
KJP 22/02
39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Esteja ciente de que o DROP COLUMN não remove fisicamente os dados e, para tipos de comprimento fixo (int, numérico, flutuante, datetime, identificador exclusivo etc.), o espaço é consumido mesmo para os registros adicionados depois que as colunas foram descartadas. Para se livrar do espaço desperdiçado, faça ALTER TABLE ... REBUILD.

Remus Rusanu
fonte
11
+1 para a observação sobre tamanhos de tabela e que exigem um REBUILD. Você pode fornecer um link para a documentação como referência?
perfil completo de Jesse Webb
2
Bem ali na ALTER TABLE: msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu
4
Conversei com meu DBA sobre fazer um REBUILD e ele disse que, se a tabela tivesse um índice agrupado (que o meu possuía), eu poderia simplesmente executar ALTER INDEX PK_IndexName ON TableName REBUILDe recuperar o espaço. Isso é descrito aqui: msdn.microsoft.com/en-us/library/ms189858.aspx na seção "Reconstruindo um índice".
perfil completo de Jesse Webb
1
Qualquer um pode esclarecer por que isso seria implementado dessa maneira. Se eu largar a coluna, espero que índices, dados e tudo o que foi criado nessa coluna sejam removidos. Deixar espaço desperdiçado sem aviso prévio parece uma má prática ou estou perdendo alguma coisa?
DanteTheSmith
13

Isso pode ser tarde, mas compartilhá-lo para os novos usuários que visitam esta pergunta. Para descartar várias colunas, a sintaxe real é

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

Portanto, para cada coluna, você precisa especificar "soltar coluna" no Mysql 5.0.45.

ZOPE MANISH
fonte
Esta é uma sintaxe incorreta. Uso: Teste ALTER TABLE COLUNA DE GOTA c1, c2;
Graeme
1
@ Graeme, a sintaxe está correta, eu testei e funcionará, se eu usar: ALTER TABLE Test DROP COLUMN c1, c2; O MySQL lança um erro. ... perto de c2
Tom Mwenda 04/04
6
@TomBikiNurse A questão tem uma referência MSDN, portanto, assume-se que o SQL em causa está relacionada com o MS SQL Server e não MySQL
Surya Pratap
essa é a sintaxe real. as respostas melhor votadas estão erradas.
Vardumper
@SuryaPratap A pergunta menciona 'my SQL' no último parágrafo.
Eternal21
4

A sintaxe especificada pela Microsoft para descartar uma parte da coluna de uma instrução ALTER é esta

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

Observe que [, ... n] aparece após o nome da coluna e no final de toda a cláusula de descarte. O que isso significa é que existem duas maneiras de excluir várias colunas. Você pode fazer isso:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

ou isto

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

Essa segunda sintaxe é útil se você deseja combinar a queda de uma coluna com a eliminação de uma restrição:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Ao descartar colunas, o SQL Sever não recupera o espaço ocupado pelas colunas descartadas. Para tipos de dados armazenados em linha nas linhas (int por exemplo), pode até ocupar espaço nas novas linhas adicionadas após a instrução alter. Para contornar isso, você precisa criar um índice em cluster na tabela ou reconstruir o índice em cluster, se ele já tiver um. A reconstrução do índice pode ser feita com um comando REBUILD após modificar a tabela. Mas esteja avisado que isso pode ser lento em mesas muito grandes. Por exemplo:

ALTER TABLE Test
    REBUILD;
Martin Brown
fonte
3

Para o MySQL (versão 5.6), você não pode fazer várias dropdescargas de coluna com uma única instrução, mas com várias dropinstruções:

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> 

Entre, drop <col_name>está abreviado para, drop column <col_name>como você pode ver de drop c3cima.

CSY
fonte
2

Se for apenas uma coluna para excluir, a sintaxe abaixo funciona

ALTER TABLE tablename DROP COLUMN column1;

Para excluir várias colunas, usando o método DROP COLUMNnão funciona, a sintaxe abaixo funciona

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

kk250040
fonte
1
alter table tablename drop (column1, column2, column3......);
Neelima
fonte
Esta é uma sintaxe incorreta. Uso: Teste ALTER TABLE COLUNA DE GOTA c1, c2;
Graeme
1

Genérico:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Por exemplo:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
Chirag Thakar
fonte
0

esta consulta irá alterar a coluna múltipla testá-lo.

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

alter table test drop(a,B);
Ratan Nahak
fonte
Esta é uma sintaxe incorreta. Uso: Teste ALTER TABLE COLUNA DE GOTA c1, c2;
Graeme
0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

para MySQL DB.

Ou você pode adicionar alguma coluna enquanto altera na mesma linha:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
naveen vaishnav
fonte