SQL Serverで単一のALTER TABLEステートメントを使用して複数の列を削除する方法


292

1つのALTER TABLEステートメントで1つのテーブルから複数の列を削除する1つのSQLコマンドを記述したいと思います。

以下からのMSDNのALTER TABLEのドキュメント ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

constraint_nameまたはcolumn_nameがテーブルから削除されることを指定します。互換性レベルが65以前の場合、DROP COLUMNは許可されません。複数の列と制約をリストできます。

ステートメントには複数の列をリストできると書かれていますが、構文にはオプションのコンマや構文を示唆するものは何も表示されていません。

(可能な場合)1つのステートメントで複数の列を削除する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

正確に; 私が持っていた2列目は索引で使用されました。私はそのインデックスを削除し、その後私のDROPステートメントは完全に機能しました。
Jesse Webb

@jeicam-おそらく、削除しようとしている列の1つが主キーである可能性があるためです。
Benny

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 ではない 一部のDBMSのデータ物理的に削除され。たとえば、MS SQL。固定長型(intnumericfloatdatetimeuniqueidentifierなど)の場合、列が削除された後に追加されたレコードでもスペースが消費されます。無駄なスペースを取り除くには、を実行してくださいALTER TABLE ... REBUILD


3
PostgreSQLの場合COLUMN、MySqlのようにキーワードを省略することもできます。
Artem Novikov

1
MySQLでもMS SQLおよびPostgre SQLと同じ形式を使用できます。ALTERTABLE table_name DROP COLUMN column_name1、column_name2;
jciloa 2017

他の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

2
ALTER TABLEのすぐそこにあります:msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu

4
私はDBAにREBUILDの実行について話しました。彼は、テーブルにクラスター化されたインデックス(私の場合)があれば、実行するだけでALTER INDEX PK_IndexName ON TableName REBUILDスペースを取り戻すことができると言いました。これについては、msdn.microsoft.com / en-us / library / ms189858.aspxの「インデックスの再構築」セクションで多少説明しています。
Jesse Webb

1
誰もがなぜこれをそのように実装するのかについていくつかの光を当てることができますか?列を削除した場合、インデックス、データ、およびその列に構築されたすべてが失われることを期待します。警告を出さずに無駄なスペースを残すのは悪い習慣のように思えますか、それとも何か不足していますか?
DanteTheSmith 2017

13

これは遅いかもしれませんが、この質問にアクセスする新しいユーザーのために共有します。複数の列を削除するには、実際の構文は

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

したがって、Mysql 5.0.45では、すべての列について「列の削除」を指定する必要があります。


これは不正な構文です。使用:ALTER TABLEテストDROP COLUMN c1、c2;
Graeme

1
@Graeme構文は正しい、私はそれをテストし、私が使用する場合は機能します。ALTERTABLE Test DROP COLUMN c1、c2; Mysqlはエラーをスローします。... c2付近
Tom Mwenda 2013

6
@TomBikiNurseこの質問にはMSDNリファレンスが含まれているため、問題のSQLはMySQLではなくMS SQL Serverに関連していると想定されていました
Surya Pratap

これは実際の構文です。より良い投票の答えは間違っています。
Vardumper 2016年

@SuryaPratapこの質問では、最後の段落で「my SQL」について言及しています。
Eternal21

4

ALTERステートメントの列部分を削除するためにMicrosoftが指定した構文は、次のとおりです。

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

[、... n]は、列名の後とドロップ句全体の最後の両方に表示されることに注意してください。つまり、複数の列を削除するには2つの方法があります。あなたはこれを行うことができます:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

またはこれ

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

この2番目の構文は、列のドロップと制約のドロップを組み合わせる場合に役立ちます。

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テストDROP COLUMN 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);

これは不正な構文です。使用:ALTER TABLEテストDROP COLUMN c1、c2;
Graeme

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.