Jak DROP wielu kolumn za pomocą pojedynczej instrukcji ALTER TABLE w SQL Server?

292

Chciałbym napisać jedno polecenie SQL, aby usunąć wiele kolumn z jednej tabeli w jednej ALTER TABLEinstrukcji.

Z dokumentacji MSDN ALTER TABLE ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Określa, że ​​nazwa ograniczenia lub nazwa kolumny jest usuwana z tabeli. DROP COLUMN nie jest dozwolone, jeśli poziom zgodności wynosi 65 lub wcześniej. Można wymienić wiele kolumn i ograniczeń.

Mówi, że wielokrotne kolumny mogą być wymienione w instrukcji, ale składnia nie pokazuje opcjonalnego przecinka ani niczego, co sugerowałoby nawet składnię.

Jak mam napisać SQL, aby usunąć wiele kolumn w jednej instrukcji (jeśli to możliwe)?

Jesse Webb
źródło

Odpowiedzi:

431

W przypadku programu SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

Składnia jest następująca

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

W przypadku MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

lub jak ten 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 Słowo COLUMNjest opcjonalne i można je pominąć, z wyjątkiem RENAME COLUMN(w celu odróżnienia operacji zmiany nazwy kolumny od operacji zmiany nazwy RENAMEtabeli). Więcej informacji tutaj .

Alex Aza
źródło
1
@Gweebz - Zakładam, że błąd, który miałeś, był związany z użyciem kolumny. Kolumna może być użyta w ograniczeniu, indeksie lub innej kolumnie obliczeniowej.
Alex Aza
Dokładnie; druga kolumna, którą miałem, została użyta w indeksie. Upuściłem ten indeks, a potem moje oświadczenie DROP działało doskonale.
Jesse Webb
@jeicam - Prawdopodobnie tak się stanie, ponieważ 1 z kolumn, które próbujesz usunąć, może być kluczem podstawowym.
Benny
196

Zreasumowanie

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;

Być świadomym

DROP COLUMNnie fizycznie usunąć dane dla niektórych DBMS. Np. Dla MS SQL. W przypadku typów o stałej długości ( int , numeryczna , zmiennoprzecinkowa , data- godzina , unikalny identyfikator itp.) Przestrzeń jest zużywana nawet dla rekordów dodanych po upuszczeniu kolumn. Pozbądź się zmarnowanej przestrzeni ALTER TABLE ... REBUILD.

Denis Rozhnev
źródło
3
W przypadku PostgreSQL możesz nawet pominąć COLUMNsłowo kluczowe jak w MySql.
Artem Novikov,
1
Możesz również użyć tego samego formatu dla MySQL jak dla MS SQL i Postgre SQL: ALTER TABLE nazwa_tabeli DROP COLUMN nazwa_kolumny1, nazwa_kolumny2;
jciloa
Dziękujemy za rozszerzenie odpowiedzi na innych dostawców DB!
KJP
39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Należy pamiętać, że DROP COLUMN nie usuwa danych fizycznie, a dla typów o stałej długości (int, numeryczna, zmiennoprzecinkowa, datetime, unikalny identyfikator itp.) Przestrzeń jest zużywana nawet dla rekordów dodanych po upuszczeniu kolumn. Pozbądź się zmarnowanej przestrzeni ALTER TABLE ... REBUILD.

Remus Rusanu
źródło
11
+1 za notatkę o rozmiarach tabel i wymagającą ODBUDOWANIA. Czy możesz podać link do dokumentacji jako odniesienie?
Jesse Webb
2
Właśnie tam w ALTER TABLE: msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu
4
Rozmawiałem z moim DBA o zrobieniu ODBUDOWANIA, a on powiedział, że jeśli tabela miałaby indeks klastrowany (który mój miał), mógłbym po prostu biec ALTER INDEX PK_IndexName ON TableName REBUILDi odzyskałoby to miejsce. Jest to nieco opisane tutaj: msdn.microsoft.com/en-us/library/ms189858.aspx w sekcji „Przebudowa indeksu”.
Jesse Webb
1
Każdy może rzucić nieco światła na DLACZEGO w takim razie należy to wdrożyć? Jeśli upuszczę kolumnę, spodziewam się, że indeksy, dane i wszystko zbudowane na tej kolumnie znikną. Pozostawienie zmarnowanej przestrzeni bez ostrzeżenia wydaje się złym postępowaniem, czy coś mi brakuje?
DanteTheSmith
13

Może to być późno, ale podziel się nim z nowymi użytkownikami odwiedzającymi to pytanie. Rzeczywistą składnią jest upuszczanie wielu kolumn

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

Tak więc dla każdej kolumny musisz określić „upuść kolumnę” w Mysql 5.0.45.

MANISH ZOPE
źródło
To jest niepoprawna składnia. Zastosowanie: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1
@Graeme składnia jest poprawna, przetestowałem ją i działa, jeśli użyję: ALTER TABLE Test DROP COLUMN c1, c2; Mysql zgłasza błąd. ... w pobliżu c2
Tom Mwenda
6
@TomBikiNurse Pytanie ma odniesienie do MSDN, dlatego przyjęto, że dany SQL jest powiązany z MS SQL Server, a nie MySQL
Surya Pratap
to jest faktyczna składnia. lepiej głosowane odpowiedzi są błędne.
Vardumper
@SuryaPratap Pytanie zawiera wzmiankę „mój SQL” w ostatnim akapicie.
Eternal21
4

Składnia określona przez Microsoft dla upuszczania części kolumny instrukcji ALTER jest następująca

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

Zauważ, że [, ... n] pojawia się zarówno po nazwie kolumny, jak i na końcu całej klauzuli upuszczania. Oznacza to, że istnieją dwa sposoby usunięcia wielu kolumn. Możesz to zrobić:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

albo to

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

Ta druga składnia jest przydatna, jeśli chcesz połączyć upuszczenie kolumny z usunięciem ograniczenia:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Podczas upuszczania kolumn program SQL Sever nie odzyskuje miejsca zajmowanego przez upuszczone kolumny. W przypadku typów danych przechowywanych w wierszach (na przykład int) może nawet zająć miejsce w nowych wierszach dodanych po instrukcji alter. Aby obejść ten problem, należy utworzyć indeks klastrowany w tabeli lub przebudować indeks klastrowany, jeśli już go ma. Odbudowywanie indeksu można wykonać za pomocą polecenia REBUILD po zmodyfikowaniu tabeli. Ale ostrzegam, że to może być powolne na bardzo dużych stołach. Na przykład:

ALTER TABLE Test
    REBUILD;
Martin Brown
źródło
3

W przypadku MySQL (wer. 5.6) nie można upuszczać wielu kolumn za pomocą jednego pojedynczego komunikatu, dropale raczej wielu dropwpisów:

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>jest skrótem, drop column <col_name>jak widać z drop c3góry.

CSY
źródło
2

Jeśli jest to tylko jedna kolumna, usunięcie poniższej składni działa

ALTER TABLE tablename DROP COLUMN column1;

W przypadku usuwania wielu kolumn przy użyciu opcji nie DROP COLUMNdziała poniższa składnia działa

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

kk250040
źródło
1
alter table tablename drop (column1, column2, column3......);
Neelima
źródło
To jest niepoprawna składnia. Zastosowanie: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1

Rodzajowy:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Na przykład:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
Chirag Thakar
źródło
0

to zapytanie zmieni test na wiele kolumn.

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

alter table test drop(a,B);
Ratan Nahak
źródło
To jest niepoprawna składnia. Zastosowanie: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

dla MySQL DB.

Lub możesz dodać kolumnę, zmieniając w tym samym wierszu:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
naveen vaishnav
źródło