SQLでは、ALTER TABLE
ステートメントは、既存のテーブルの定義を変更します。
ALTER TABLE
を使用できます 列と制約を変更、追加、または削除します。
DBMSによっては、ALTER TABLE
ステートメントを使用して、パーティションを再割り当てして再構築したり、制約とトリガーを無効にして有効にしたりすることもできます。
構文
ALTER TABLE
ステートメントは一般的に次のようになります:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
場所:
-
table_name
変更するテーブルの名前です。 -
[alter_option [, alter_option] …]
実行する特定の変更のリストです(たとえば、ADD
その後に列名と定義、またはDROP COLUMN
が続きます その後に列名などが続きます。 -
[partition_options]
パーティションテーブル専用のオプションのオプションリストです。すべてのDBMSがパーティションテーブルをサポートしているわけではありません。その場合、そのようなオプションを使用すると、パーティションを追加、削除、破棄、インポート、マージ、または分割したり、パーティションのメンテナンスを実行したりできる場合があります。
ALTER TABLE
の完全な構文 非常に複雑になる可能性があり、DBMS間で大幅に異なります。この記事でカバーされていないものについては、DBMSのドキュメントを参照してください。
以下は、最も一般的なALTER TABLE
の例です。 オペレーション。
新しい列を追加する
テーブルに新しい列を追加するには、ADD
を使用します 句の後に列名とデータ型が続きます。
ALTER TABLE Products
ADD ProductDescription varchar(500);
これにより、ProductDescription
という新しい列が追加されます Products
へ テーブル。
この例では、列をvarchar(500)
にしました。 ただし、新しい列に適したデータ型を使用します。
列定義に制約を含めることもできますが、これはDBMSと、テーブルにすでにデータが含まれているかどうかによって異なります(これについては以下の説明を参照してください)。
列の名前を変更する
ほとんどの主要なRDBMS(PostgreSQL、Oracle、SQLite、MySQL 8.0以降、MariaDB 10.5.2以降)では、次のように列の名前を変更できます。
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
バージョン8.0より前のMySQL、または10.5.2以降より前のMariaDBを使用している場合は、CHANGE COLUMN
を使用する必要があります。 代わりに構文。データ型を再指定する必要もあります。このように:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
SQL Serverでは、sp_rename
を使用する必要があります 列の名前を変更するためのストアドプロシージャ。このように:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
列を削除
列を削除するには、DROP COLUMN
を使用します 句の後に列名が続きます。
ALTER TABLE table_name
DROP COLUMN column_name;
列の定義を変更する
既存の列の定義を変更するための構文は、DBMS間で大幅に異なります。また、どのような変更を加える必要があるかによっても異なります。
簡単にするために、SQLServerの列に簡単な変更を加えましょう。
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
この例では、ProductDescription
を変更しました varchar(500)
の列 varchar(1000)
へ 。
以下に、同じまたは同様の変更を行うために各DBMSに必要な基本的な構文を示します。
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL、MariaDB、および10gより前のOracle:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
Oracle 10g以降の場合:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLiteでは、名前を変更する以外に、列を変更することはできません。
各DBMSの実際の構文は通常、これよりもはるかに複雑であり、何をしようとしているかによって異なります。ただし、これで基本的な列の変更を開始できます。
制限と考慮事項
通常、テーブルにデータが含まれている場合は、テーブルに変更を加えないようにする必要があります。変更を加えると、既存のデータが失われるリスクがあります。
そうは言っても、多くのDBMSは、テーブルにデータが含まれると、実際には特定の変更を行うことができなくなります。たとえば、NOT NULL
を追加できない場合があります。 データを含む列への制約。
一部のDBMSでは、DEFAULT
を使用している限り、これを実行できる場合があります。 制約(データが明示的に挿入されていない列のデフォルト値を提供するため)、ID /自動インクリメント列、タイムスタンプ列など。
一部のDBMSでは、テーブルの列を削除または変更できません。
また、一部のDBMSは、追加できるデータ型を制限しています。
例–NOTNULL制約の追加
上記のポイントを示すのに役立つ例を次に示します。
NOT NULL
で列を追加しようとするとどうなりますか SQLServerの制約。
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
結果:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
基本的に、テーブルにはすでにデータが含まれているため、SQLServerはNOT NULL
しか追加できないというエラーを返します。 テーブルが特定の基準を満たし、まだその基準を満たしていない場合の制約。
そして、その基準には正当な理由があります。
NOT NULL
制約により、NULL
がないことが保証されます 任意の行の列の値。問題は、テーブルにすでにデータがあり、新しい列を追加すると、それらの既存の行がNULL
になることです。 –これはすぐにNOT NULL
に違反します 制約。したがって、既存の行に移動するデータを指定する必要があります。
これを行うには、DEFAULT
を追加します 既存の行にこの列のデータが自動的に入力されるようにするための制約など。
例:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
これは単にDEFAULT
を追加するだけです 列への制約。この制約により、すべての行に値が含まれるようになります(この場合、値はN/A
です。 )値が割り当てられていない場合。これは、NOT NULL
を意味します 既存のすべての行に値が含まれるようになるため、制約に違反することはありません。
新しい列に一意の増分値が必要な場合は、代わりにIDENTITY
にすることができます。 列(またはAUTOINCREMENT
SQLiteおよびその他のDBMSで)。
ただし、テーブルにまだデータが含まれていない場合は、これらの手順を実行しなくても列を追加できる可能性があります。
パーティションオプション
この記事は初心者を対象としており、パーティション化されたテーブルは初心者のチュートリアルの領域から少し外れています。
そうは言っても、ALTER TABLE
に関するいくつかのパーティショニングオプションについて簡単に説明します。 ステートメント。
DBMSがパーティションテーブルをサポートしている場合は、おそらくALTER TABLE
でパーティションオプションも提供します。 ステートメント。
たとえば、MySQLでは次のことができます。
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
これにより、テーブルがHASH
によって8つのパーティションに分割されます。 、ProductId
を使用 パーティションキーとしての列。
PARTITION BY HASH
式の残りの部分(この場合はProductId
)を使用します 列)をパーティションの数(つまり、モジュラス)で割った値。
範囲パーティションを使用することもできます。既存のテーブルに範囲パーティションを追加する方法は次のとおりです。
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
この例は、Products
テーブルにはすでに8つの範囲パーティションがあり、Partition9
という別のパーティションを追加しています 。
次のようにパーティションを削除できます:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
これらの例はMySQL用であることに注意してください。
また、SQLServerのパーティションテーブルに関する記事もいくつか書いています。 ALTER TABLE
に関して ステートメント、パーティションを切り替える方法とパーティションを切り替える方法は次のとおりです(どちらもALTER TABLE
で実行されます) 。
SQL Serverでは、一部のパーティションオプションを他のステートメントで実行する必要があります。たとえば、パーティションのマージは、ALTER PARTITION FUNCTION
を使用して行われます。 ステートメント、およびパーティションの分割は、ALTER PARTITION SCHEME
を使用して行われます。 ステートメント。
SQL Serverのパーティションテーブルについて詳しく知りたい場合は、SQLServerでパーティションテーブルを作成する方法をご覧ください。
ALTER TABLE
SQLiteで
また、SQLiteはALTER TABLE
のサポートが非常に限られていることにも言及する必要があります 声明。 SQLiteでは、ALTER TABLE
ステートメントを使用すると、テーブルの名前を変更したり、テーブル内の列の名前を変更したり、既存のテーブルに新しい列を追加したりできます。
その他の変更を行う場合は、テーブルを削除してやり直す必要があります。これは、外部キーの追加にも当てはまります。