SQLでは、テーブルから列を削除する場合は、ALTER TABLEを使用する必要があります。 DROP COLUMNを含むステートメント 条項。
これにより、列とそのすべてのデータが削除されます。
構文
構文は次のようになります:
ALTER TABLE table_name
DROP COLUMN column_name;
一部のRDBMSは、オプションのIF EXISTSを受け入れます 引数。これは、列が存在しない場合にエラーを返さないことを意味します。
一部のRDBMSは、オプションのCASCADEも受け入れます。 およびRESTRICT 列に依存関係がある場合の処理を指定する引数。詳細については、以下を参照してください。
例
実例を示します。
ALTER TABLE Products
DROP COLUMN ProductDescription;
これにより、ProductDescriptionが削除されます Productsの列 テーブル。
IF EXISTS 引数
RDBMSによっては、IF EXISTSを使用できる場合があります 引数。これは、列がすでに存在する場合にのみ条件付きで列を削除します。
これを行う利点は、列が存在しない場合でもエラーが発生しないことです。
例:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription; 変更を制限する
RDBMSによっては、CASCADEを使用できる場合があります およびRESTRICT 列に外部キーやビューなどの依存関係がある場合の処理を指定する引数。
RESTRICT 通常はデフォルトの動作であるため、これらの引数を指定しない場合、依存オブジェクトがある場合、DBMSは列の削除を拒否します。
例:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT; 上記のステートメントを使用するときに、列に依存関係がある場合、ドロップ操作は失敗し、エラーが発生します。
ビューによって参照されているテーブルを削除しようとすると、PostgreSQLで発生するエラーは次のとおりです。
cannot drop column productdescription of table products because other objects depend on it
変更をカスケードする
CASCADEの使用 オプションを指定すると、依存オブジェクトがすべて削除されます。
前の例をCASCADEに変更するとどうなりますか。 :
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE; 結果:
NOTICE: drop cascades to view vproducts Commands completed successfully
この場合、列が削除され、vproductsというビューを説明するメッセージが表示されました。 も削除されました。
CASCADE およびRESTRICT PostgreSQLではサポートされていますが、SQLServerやMySQLではサポートされていません。どちらのキーワードもMariaDBで使用できますが、効果はありません。
OracleはCASCADE CONSTRAINTSを受け入れます ドロップされた列で定義された主キーと一意キーを参照するすべての外部キー制約と、ドロップされた列で定義されたすべてのマルチ列制約をドロップする句。
複数の列を削除する
一部のRDBMでは、単一のALTER TABLE内に複数の列をドロップできます。 声明。構文はRDBMSによって異なります。
SQL Serverでは、各列をコンマで区切ってリストするだけです。
ALTER TABLE t1
DROP COLUMN c1, c2;
他のRDBMS(MySQLやPostgreSQLなど)では、DROP COLUMNを書き直す必要があります。 各列:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
この構文はSQLの拡張であり、DROPを1つだけ持つというSQL標準に準拠していないことに注意してください。 ALTER TABLEごとの句 ステートメント。
最後の列を削除
一部のRDBMでは、テーブルの最後の列を削除できるため、列のない空のテーブルが残ります。これはSQL標準の拡張です(ゼロ列テーブルは許可されません)。
たとえば、PostgreSQLでは、次のステートメントを使用して、テーブルの最後の残りの列を削除しました
ALTER TABLE t1
DROP COLUMN c3; 結果:
Commands completed successfully
しかし、SQL Serverでは、同じことをすると:
ALTER TABLE t1
DROP COLUMN c1, c2, c3; 結果:
Msg 4923, Level 16, State 1, Line 1 ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.
このエラーメッセージの文言にもかかわらず、残っている列はc3だけではないことに注意してください。実際には3つの列がありました。ただし、他の2つが削除された場合、c3が最後に残っていたはずです。この場合、3つの列のいずれも実際には削除されませんでした。
いずれにせよ、他の2つを削除したとしても、SQLServerは最後の1つを削除することを拒否します。
MySQLは、テーブルの最後の列を削除することも拒否します。
テーブルを削除する場合は、DROP TABLEを使用してください 。
RDBMSによる制限
基本的なDROP COLUMN 構文はほとんどの主要なRDBMSで非常に似ており、各RDBMSには、列が削除されるかどうかについて独自の制限がある傾向があります。
いくつかの主要なRDBMSからの制限のいくつかを次に示します。
SQL Server
次の場合、列を削除することはできません:
- キー列として、または
INCLUDEとして、インデックスで使用されます -
CHECKで使用されます 、FOREIGN KEY、UNIQUE、またはPRIMARY KEY制約。 -
DEFAULTで定義されたデフォルトに関連付けられています キーワード、またはデフォルトオブジェクトにバインドされます。 - ルールに拘束されます。
SQL Serverのソース:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
列がテーブルから削除されると、その列は、その一部であるすべてのインデックスからも削除されます。インデックスを構成するすべての列が削除されると、インデックスも削除されます。
MySQLのソース:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
列に関連するインデックスとテーブルの制約も自動的に削除されます。
ドロップされた列を参照する多変量統計も、列を削除すると統計に単一の列のデータのみが含まれる場合は削除されます。
CASCADEを使用する必要があります テーブルの外側にあるものが列に依存している場合(外部キーやビューなど)。
PostgreSQLのソース:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLiteはDROP COLUMNをサポートしていません 構文。 SQLiteで列をドロップすることはできません。
SQLiteに列をドロップする必要がある場合は、SQLiteのドキュメントで推奨されている12ステップのプロセスに従うことをお勧めします。
SQLiteのソース:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
列がいずれかのインデックスの一部である場合、同じ名前の新しい列を同時に追加する場合を除いて、列はそれらから削除されます。インデックスのすべての列が削除された場合、インデックスは削除されます。列がビューまたはトリガーで使用された場合、次にビューまたはトリガーにアクセスしたときにエラーが発生します。
MariaDB 10.2.8から、複数列のUNIQUEの一部である列を削除する 制約は許可されていません。
MariaDBはRESTRICTを受け入れます およびCASCADE 他のデータベースシステムからの移植を容易にするためですが、MariaDBでは何もしません。
MariaDB 10.4.0は、インスタントDROP COLUMNをサポートします 。 DROP COLUMN インデックス付き列のは、DROP INDEXを意味します (UNIQUE以外の場合 複数列のインデックス、場合によってはADD INDEX )。これらはALGORITHM=INSTANTでは許可されません 、ただし、以前とは異なり、ALGORITHM=NOCOPYで許可できます。 。
MariaDBのソース:https://mariadb.com/kb/en/alter-table/#drop-column