SQL Server에서 단일 ALTER TABLE 문으로 여러 열을 삭제하는 방법은 무엇입니까?


292

하나의 ALTER TABLE명령문 에서 단일 테이블의 여러 열을 삭제하는 단일 SQL 명령을 작성하고 싶습니다 .

에서 MSDN의 ALTER 표 문서 ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

constraint_name 또는 column_name이 테이블에서 제거되도록 지정합니다. 호환성 수준이 65 이하인 경우 DROP COLUMN을 사용할 수 없습니다. 여러 열과 제약 조건을 나열 할 수 있습니다.

명령문에 여러 열을 나열 할 수 있지만 구문에는 선택적 쉼표 또는 구문을 암시하는 것도 표시되지 않습니다.

한 문장에서 여러 열을 삭제하려면 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-발생한 오류가 열 사용과 관련이 있다고 가정합니다. 열은 제약 조건, 인덱스 또는 다른 계산 열에 사용될 수 있습니다.
Alex Aza

정확하게; 내가 가지고있는 두 번째 열은 색인에 사용되었습니다. 그 인덱스를 삭제하고 그 후에 DROP 문이 완벽하게 작동했습니다.
Jesse Webb

@jeicam-삭제하려는 열 중 1 개가 기본 키 일 수 있기 때문에 발생했을 것입니다.
베니

196

요약

오라클 :

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL 서버 :

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일부 DBMS에 대한 데이터를 물리적으로 제거 하지 않습니다 . 예를 들어 MS SQL의 경우. 고정 길이 유형 ( int , numeric , float , datetime , uniqueidentifier 등)의 경우 열이 삭제 된 후 추가 된 레코드에도 공간이 사용됩니다. 낭비되는 공간을 없애려면해야 ALTER TABLE ... REBUILD합니다.


3
PostgreSQL의 경우 COLUMNMySql에서와 같이 키워드를 생략 할 수도 있습니다 .
Artem Novikov

1
MS SQL 및 Postgre SQL과 동일한 형식의 MySQL을 사용할 수도 있습니다. ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
jciloa

다른 DB 공급 업체에 대한 답변을 확장 해 주셔서 감사합니다!
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 참조 문서로 링크를 제공 할 수 있습니까?
Jesse Webb


4
나는 DBA에게 REBUILD 수행에 관해 이야기했으며 테이블에 클러스터 된 인덱스 (내가했던)가 있으면 그냥 실행할 수 ALTER INDEX PK_IndexName ON TableName REBUILD있고 공간을 되 찾을 것이라고 말했다. 여기에 다소 설명되어 있습니다. "색인 재 구축"섹션의 msdn.microsoft.com/en-us/library/ms189858.aspx .
Jesse Webb

1
누구나 왜 그렇게 구현할 수 있는지에 대해 밝힐 수 있습니까? 열을 삭제하면 인덱스, 데이터 및 해당 열에 작성된 모든 항목이 사라질 것으로 예상됩니다. 경고없이 많은 공간을 낭비하는 것은 나쁜 습관처럼 보입니까, 아니면 뭔가 빠졌습니까?
DanteTheSmith

13

늦었을 수 있지만이 질문을 방문하는 새로운 사용자를 위해 공유 할 수 있습니다. 여러 열을 삭제하려면 실제 구문은

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

따라서 모든 열에 대해 Mysql 5.0.45에서 "drop column"을 지정해야합니다.


이것은 잘못된 구문입니다. 사용 : ALTER TABLE Test DROP COLUMN c1, c2;
Graeme 2016 년

1
@Graeme 구문이 정확합니다. 테스트 한 결과 다음과 같은 경우 작동합니다. ALTER TABLE Test DROP COLUMN c1, c2; MySQL은 오류가 발생합니다. ... c2 인근
Tom Mwenda

6
@TomBikiNurse이 질문에는 MSDN 참조가 포함되어 있으므로 해당 SQL은 MySQL이 아닌 MS SQL Server와 관련이 있다고 가정합니다.
Surya Pratap

이것이 실제 구문입니다. 더 나은 투표 응답이 잘못되었습니다.
Vardumper

@SuryaPratap 질문은 마지막 단락에서 'my SQL'을 언급합니다.
Eternal21

4

ALTER 문의 열 부분을 삭제하기 위해 Microsoft에서 지정한 구문 은 다음과 같습니다.

 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 Server는 삭제 된 열이 차지하는 공간을 회수하지 않습니다. 행에 인라인으로 저장된 데이터 형식 (예 : 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......);

이것은 잘못된 구문입니다. 사용 : ALTER TABLE Test DROP COLUMN c1, c2;
Graeme 2016 년

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);

이것은 잘못된 구문입니다. 사용 : ALTER TABLE Test DROP COLUMN c1, c2;
Graeme 2016 년

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

MySQL DB의 경우.

또는 같은 줄에서 변경하면서 열을 추가 할 수 있습니다.

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.