Как удалить несколько столбцов с помощью одного оператора ALTER TABLE в SQL Server?

Я хотел бы написать одну команду SQL для удаления нескольких столбцов из одной таблицы в одном операторе ALTER TABLE.

Из документации MSDN ALTER TABLE .. .

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Указывает, что имя_ограничения или имя_столбца удаляется из таблицы. DROP COLUMN не допускается, если уровень совместимости 65 или ниже. Можно указать несколько столбцов и ограничений.

В нем говорится, что в операторе могут быть перечислены несколько столбцов, но синтаксис не показывает необязательную запятую или что-либо, что даже намекало бы на синтаксис.

Как мне написать свой SQL для удаления нескольких столбцов в одном операторе (если возможно)?


person Jesse Webb    schedule 14.06.2011    source источник


Ответы (12)


Для SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

Синтаксис:

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

Для MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

или вот так 1:

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 Слово COLUMN является необязательным и может быть опущено, за исключением RENAME COLUMN (чтобы отличить операцию переименования столбца от операции переименования таблицы RENAME). Дополнительная информация здесь.

person Alex Aza    schedule 14.06.2011
comment
@Gweebz - Я предполагаю, что возникшая у вас ошибка была связана с использованием столбца. Столбец может использоваться в ограничении, индексе или другом вычисляемом столбце. - person Alex Aza; 14.06.2011
comment
Точно; второй столбец, который у меня был, использовался в Index. Я отбросил этот индекс, и после этого мой оператор DROP работал отлично. - person Jesse Webb; 14.06.2011
comment
@jeicam - это могло произойти, вероятно, потому, что один из столбцов, которые вы пытаетесь удалить, может быть первичным ключом. - person Benny; 29.01.2015

Подводя итоги

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;

Быть в курсе

DROP COLUMN не физически удаляет данные для некоторых СУБД. Например. для MS SQL. Для типов фиксированной длины (int, numeric, float, datetime, uniqueidentifier и т. Д. ) пространство используется даже для записей, добавленных после удаления столбцов. Чтобы избавиться от потраченного впустую места, сделайте ALTER TABLE ... REBUILD.

person Denis Rozhnev    schedule 01.09.2013
comment
Для PostgreSQL вы даже можете опустить ключевое слово COLUMN, как в MySql. - person Artem Novikov; 13.09.2016
comment
Вы также можете использовать тот же формат для MySQL, что и для MS SQL и Postgre SQL: ALTER TABLE имя_таблицы DROP COLUMN имя_столбца1, имя_столбца2; - person jciloa; 09.08.2017

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

Имейте в виду, что DROP COLUMN физически не удаляет данные, а для типов фиксированной длины (int, numeric, float, datetime, uniqueidentifier и т. Д.) Пространство используется даже для записей, добавленных после удаления столбцов. Чтобы избавиться от потраченного впустую места, сделайте ALTER TABLE ... REBUILD.

person Remus Rusanu    schedule 14.06.2011
comment
+1 за примечание о размерах стола и необходимости ПЕРЕСТРОЙКИ. Можете ли вы дать ссылку на документацию в качестве справочника? - person Jesse Webb; 14.06.2011
comment
Прямо в ALTER TABLE: msdn.microsoft.com/en-us/library /ms190273.aspx - person Remus Rusanu; 14.06.2011
comment
Я поговорил со своим администратором баз данных о выполнении REBUILD, и он сказал, что если бы таблица имела кластерный индекс (как у меня), я мог бы просто запустить ALTER INDEX PK_IndexName ON TableName REBUILD, и он освободил бы пространство. Это частично описано здесь: msdn.microsoft.com/en-us/library/ ms189858.aspx в разделе Восстановление индекса. - person Jesse Webb; 14.06.2011
comment
Кто-нибудь может пролить свет на ПОЧЕМУ это будет реализовано именно так? Если я отброшу столбец, я ожидаю, что исчезнут индексы, данные и все, что построено на этом столбце. Оставлять пространство впустую без предупреждения кажется плохой практикой, или я что-то упускаю? - person DanteTheSmith; 14.08.2017

Это может быть поздно, но поделитесь им с новыми пользователями, которые посещают этот вопрос. Фактический синтаксис для удаления нескольких столбцов:

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

Таким образом, для каждого столбца вам нужно указать «drop column» в Mysql 5.0.45.

person MANISH ZOPE    schedule 11.03.2013
comment
Это неправильный синтаксис. Используйте: ALTER TABLE Test DROP COLUMN c1, c2; - person Graeme; 04.06.2013
comment
@Graeme, синтаксис правильный, я протестировал его, и он работает, если я использую: ALTER TABLE Test DROP COLUMN c1, c2; Mysql выдает ошибку. ... около c2 - person Tom Mwenda; 04.07.2013
comment
@TomBikiNurse В вопросе есть ссылка на MSDN, поэтому предполагалось, что рассматриваемый SQL связан с MS SQL Server, а не с MySQL. - person Surya Pratap; 20.07.2013
comment
@SuryaPratap В последнем абзаце вопроса упоминается «мой SQL». - person Eternal21; 25.08.2017
comment
@ Eternal21 ссылка, которую вы упомянули, How should I write my SQL to drop multiple columns in one statement (if possible)? контекст предложения предполагает, что я ссылался на автора, а SQL относился к языку. - person Surya Pratap; 29.08.2017
comment
Этот синтаксис лучше, особенно если вы хотите использовать новый идемпотентный синтаксис для удаления столбцов: ALTER TABLE dbo.[TableName] DROP COLUMN IF EXISTS [Column1], COLUMN IF EXISTS [Column2] См. Сообщение Джеффа Раша: thedatayouneed.com/drop-exists-columns - person Nick Allan; 07.01.2020

Синтаксис, указанный Microsoft для удаления части столбца в ALTER заявление это

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

Обратите внимание, что [, ... n] появляется как после имени столбца, так и в конце всего предложения drop. Это означает, что есть два способа удалить несколько столбцов. Вы можете сделать это:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

или это

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

Этот второй синтаксис полезен, если вы хотите объединить удаление столбца с удалением ограничения:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

При отбрасывании столбцов SQL Sever не восстанавливает пространство, занимаемое удаленными столбцами. Для типов данных, которые хранятся в строках (например, int), он может даже занимать место в новых строках, добавленных после оператора alter. Чтобы обойти это, вам нужно создать кластерный индекс для таблицы или перестроить кластерный индекс, если он уже есть. Перестроение индекса может быть выполнено с помощью команды REBUILD после изменения таблицы. Но имейте в виду, что на очень больших столах это может быть медленным. Например:

ALTER TABLE Test
    REBUILD;
person Martin Brown    schedule 28.01.2015

Для MySQL (версия 5.6) вы не можете выполнять удаление нескольких столбцов с помощью одного оператора drop, а скорее нескольких операторов drop:

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> 

Кстати, drop <col_name> сокращен до drop column <col_name>, как вы можете видеть из drop c3 выше.

person CSY    schedule 11.08.2013

Если это всего лишь один столбец, чтобы удалить, синтаксис ниже работает

ALTER TABLE tablename DROP COLUMN column1;

Для удаления нескольких столбцов использование DROP COLUMN не работает, работает следующий синтаксис

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

person kk250040    schedule 14.06.2013

Общий:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Например:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
person Chirag Thakar    schedule 13.08.2015

для postgis это

alter table table01 drop columns col1, drop col2

person Joselin Ceron    schedule 13.10.2020
comment
пробовал с sql, но не работает. В журнал записано: 12:58:04 ALTER TABLE ORDERS DROP COLUMNS имя_пользователя, номер_контактного_пользователя, адрес_пользователя Код ошибки: 1064. Ошибка синтаксиса SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'user_name, user_contact_number, user_address' в строке 2 0,0060 сек. - person Akash Verma; 30.01.2021

этот запрос изменит тест с несколькими столбцами.

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

alter table test drop(a,B);
person Ratan Nahak    schedule 15.05.2013
comment
Это неправильный синтаксис. Используйте: ALTER TABLE Test DROP COLUMN c1, c2; - person Graeme; 04.06.2013

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

для БД MySQL.

Или вы можете добавить столбец, изменяя в той же строке:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
person naveen vaishnav    schedule 14.09.2016

person    schedule
comment
Это неправильный синтаксис. Используйте: ALTER TABLE Test DROP COLUMN c1, c2; - person Graeme; 04.06.2013