Як знизити кілька стовпців за допомогою одного оператора ALTER TABLE в SQL Server?


292

Я хотів би написати одну команду SQL, щоб випадати кілька стовпців з однієї таблиці в одному ALTER TABLEоператорі.

З документації ПІСЛЯ ТАБЛИЦІ MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Визначає, що constraint_name або стовпчик_name видаляється з таблиці. DROP COLUMN заборонено, якщо рівень сумісності становить 65 чи раніше. Можна вказати кілька стовпців і обмежень.

У ньому йдеться про те, що mutliple стовпці можуть бути вказані у виписці, але синтаксис не відображає необов'язкові коми або що-небудь, що навіть натякає на синтаксис.

Як мені написати свій 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

Узагальнення

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.


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

1
Ви також можете використовувати той же формат для MySQL, що і для MS SQL та Postgre SQL: ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
jciloa

Дякуємо вам за розширення відповідей на інших постачальників БД!
KJP

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

Майте на увазі, що DROP COLUMN фізично не видаляє дані, а для фіксованих типів довжини (int, числовий, float, datetime, унікальний ідентифікатор тощо) простір витрачається навіть для записів, доданих після скидання стовпців. Щоб позбутися марно витраченого місця ALTER TABLE ... REBUILD.


11
+1 за примітку про розміри таблиць та потребують ПОВТОРЕННЯ. Чи можете ви надати посилання на документацію як орієнтир?
Джессі Вебб

2
Прямо там, у ПІСЛЯ
Ремус Русану

4
Я розмовляв зі своєю DBA про те, щоб зробити 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.


Це неправильний синтаксис. Використання: ПІДКЛЮЧЕННЯ ТАБЛИЦІ Випробування ДРОПУВАННЯ КОЛИНИ c1, c2;
Graeme

1
@Graeme синтаксис правильний, я перевірив його, і він працює, якщо я використовую: ALTER TABLE Test DROP COLUMN c1, c2; Mysql видає помилку. ... біля c2
Tom Mwenda

6
@TomBikiNurse Питання має посилання на MSDN, отже, передбачалося, що розглянутий SQL пов'язаний з MS SQL Server, а не MySQL
Surya Pratap

це власне синтаксис. краще відповіді, що проголосували, неправильні.
Вардумпер

@SuryaPratap В останньому абзаці в цьому питанні згадується "мій SQL".
Вічний21

4

Синтаксис, визначений 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;

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> 

BTW, 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......);

Це неправильний синтаксис. Використання: ПІДКЛЮЧЕННЯ ТАБЛИЦІ Випробування ДРОПУВАННЯ КОЛИНИ c1, c2;
Graeme

1

Загальне:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Наприклад:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;

0

цей запит змінить тест на кілька стовпців.

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

alter table test drop(a,B);

Це неправильний синтаксис. Використання: ПІДКЛЮЧЕННЯ ТАБЛИЦІ Випробування ДРОПУВАННЯ КОЛИНИ c1, c2;
Graeme

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.