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


292

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

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

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

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

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

Как мне написать свой SQL, чтобы отбрасывать несколько столбцов в одном выражении (если это возможно)?

Ответы:


431

Для 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таблицы). Больше информации здесь .


1
@Gweebz - Я предполагаю, что ошибка, которая у вас была, была связана с использованием столбца. Столбец может использоваться в ограничении, индексе или другом вычисляемом столбце.
Алекс Аза

Точно; второй столбец, который у меня был, использовался в указателе. Я удалил этот индекс, и мое заявление DROP прекрасно сработало после этого.
Джесси Уэбб

@jeicam - Это могло бы произойти, потому что один из столбцов, которые вы пытаетесь удалить, может быть первичным ключом.
Бенни

196

Подведение итогов

Оракул :

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.


3
Для PostgreSQL вы можете даже опустить COLUMNключевое слово, как в MySql.
Артем Новиков

1
Вы также можете использовать тот же формат для MySQL, что и для MS SQL и Postgre SQL: ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
17

Спасибо за распространение ответов на других поставщиков БД!
KJP

39
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.


11
+1 за примечание о размерах стола и необходимости REBUILD. Можете ли вы предоставить ссылку на документацию в качестве ссылки?
Джесси Уэбб


4
Я говорил с моим администратором базы данных о выполнении REBUILD, и он сказал, что если бы таблица имела кластеризованный индекс (который у меня был), я мог бы просто запустить, ALTER INDEX PK_IndexName ON TableName REBUILDи он освободит место. Это несколько описано здесь: msdn.microsoft.com/en-us/library/ms189858.aspx в разделе «Перестройка индекса».
Джесси Уэбб

1
Кто-нибудь может пролить свет на то, ПОЧЕМУ это будет реализовано так? Если я опущу столбец, я ожидаю, что индексы, данные и все, что построено на этом столбце, исчезнет. Оставлять пространство впустую без особого предупреждения, как плохая практика, или я что-то упустил?
DanteTheSmith

13

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

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

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


Это неверный синтаксис. Использование: ALTER TABLE Test DROP COLUMN c1, c2;
Грэм,

1
@ Graeme синтаксис правильный, я проверил его, и он работает, если я использую: ALTER TABLE Test DROP COLUMN c1, c2; Mysql выдает ошибку. ... около c2
Том Мвенда

6
@TomBikiNurse Вопрос имеет ссылку на MSDN, поэтому предполагалось, что рассматриваемый SQL связан с MS SQL Server, а не с MySQL
Сурья Пратап

это фактический синтаксис. лучше проголосовавшие ответы неверны.
Vardumper

@SuryaPratap Вопрос упоминает «мой SQL» в последнем абзаце.
Eternal21

4

Синтаксис, определенный Microsoft для отбрасывания части столбца оператора ALTER, таков :

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

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

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;

3

Для 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сверху.


2

Если это просто один столбец для удаления, ниже работает синтаксис

ALTER TABLE tablename DROP COLUMN column1;

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

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


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

Это неверный синтаксис. Использование: ALTER TABLE Test DROP COLUMN c1, c2;
Грэм,


0

этот запрос изменит многостолбцовый тест.

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

alter table test drop(a,B);

Это неверный синтаксис. Использование: ALTER TABLE Test DROP COLUMN c1, c2;
Грэм,

0
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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.