ALTER TABLE

ALTER TABLEとは、既存の表定義を変更するSQL文です。以下に示す表定義を変更できます。

ALTER TABLEに必要な権限

自分のスキーマ内にある表の定義を変更するには、とくに権限は必要ない。

他のスキーマ内にある表の定義を変更するには、ALTER ANY TABLEシステム権限が必要である。

表の名前を変更する

ALTER TABLE [schema.]old RENAME new
schema
名前を変更する表が存在するスキーマの名前を指定する。自分のスキーマ内にある表の名前を変更する場合は、スキーマ名の指定は省略できる。
old
変更前のテーブルの名前を指定する。

既存のテーブル「emp」の名前を「employee」に変更する例を示す。

ALTER TABLE emp RENAME employee;
new
変更後のテーブルの名前を指定する。

カラム追加

ALTER TABLE [schema.]table
  ADD (column data_type [DEFAULT default_value] [,column data_type [DEFAULT default_value]...)
schema

列を追加する表のスキーマを指定する。スキーマの指定を省略した場合は、自分のスキーマ内の表が対象となる。

table

列を追加する表を指定する。

column

追加する列の名前を指定する。

data_type
追加する列のデータ型を指定する。
default_value
追加する列のデフォルト値を指定する。

カラム変更

ALTER TABLE [schema.]table MODIFY (
column [data_type] [DEFAULT default_value]
[,column [data_type] [DEFAULT default_value]]
...
)

NOT NULL制約を追加する例

ALTER TABLE employee MODIFY (empno NOT NULL, ename NOT NULL)

制約を追加する列がひとつの場合、列名のリストを囲む括弧を省略することができる。

ALTER TABLE employee MODIFY empno NOT NULL

NOT NULL制約を削除する例

ALTER TABLE employee MODIFY (empno NULL, ename NULL)

制約を削除する列がひとつの場合、列名のリストを囲む括弧を省略することができる。

ALTER TABLE employee MODIFY empno NULL

カラムの桁数を変更する

ALTER TABLEで列の桁数を変更できる。列の桁数を縮小する場合、既存データの最大桁数より小さくすることはできない。

ALTER TABLE emp MODIFY (ename VARCHAR2(100))

列の名前を変更する

ALTER TABLE [schema.]table RENAME COLUMN old TO new
schema
テーブルが存在するスキーマを指定する。
table
カラムの名前を変更するテーブルを指定する。
old_column
変更前のカラムの名前を指定する。
new_column
変更後のカラムの名前を指定する。

empテーブルのsalカラムの名前をsalaryに変更する例を示す。

ALTER TABLE emp RENAME COLUMN sal TO salary

カラム削除

ALTER TABLE [schema.]table DROP (column [,column...]) [CASCADE CONSTRAINTS]

他の表から外部キー制約で参照されている列の場合はエラーとなり、削除できません。これは、参照先の列が削除されてしまうと、参照元の外部キー制約がすべて制約違反になってしまい、データの整合性が無くなってしまうからです。

外部キー制約で参照されている列
Figure 1. 外部キー制約で参照されている列

この場合、CASCADE CONSTRAINTS を指定すると、外部キー制約ごと列を削除することができます。

外部キー制約ごと列を削除
Figure 2. 外部キー制約ごと列を削除

表に制約を追加する

テーブルに主キーを追加する

ALTER TABLE [schema.]table
ADD [COSTRAINT constraint_name]
PRIMARY KEY (column_name[, column_name...])
[USING INDEX [TABLESPACE {tablespace_name|DEFAULT}] [PCTFREE size] [PCTUSED size] [INITRANS integer]]
schema
変更する表が存在するスキーマの名前を指定する。自分のスキーマ以外の表を変更するには、ALTER ANY TABLEシステム権限が必要である。スキーマ名の指定を省略した場合は、自分のスキーマ内にある表を変更する。
table
主キーを追加する表の名前を指定する。
constraint_name
追加する制約の名前を指定する。制約名の指定を省略した場合は、自動的に生成された制約名が暗黙のうちに付けられる。
column_name
主キーに設定する列の名前を指定する。カンマで区切って複数の列を指定することもできる。
USING INDEX
主キーに索引を使用する。
TABLESPACE tablespace_name
索引が使用する表領域の名前を指定する。
TABLESPACE DEFAULT
索引はデフォルトの表領域を使用する。
PCTFREE
データベースオブジェクトの各データブロック内で、オブジェクトの行を将来更新するために確保しておく領域の割合をパーセント単位で指定する。
PCTUSED
使用済み領域のうち、データベースオブジェクトのデータブロックごとに確保される最小限の割合をパーセント単位で指定する。
INITRANS
データベースオブジェクトに割り当てられた各データブロックに割り当てられる、同時実行トランザクションエントリの初期値を指定する。

テーブルに一意キー制約を追加する

ALTER TABLE [schema.]table
ADD [COSTRAINT constraint_name]
UNIQUE (column_name [,column_name...])
[USING INDEX [TABLESPACE {tablespace_name|DEFAULT}] [PCTFREE size] [PCTUSED size] [INITRANS integer]]
schema
変更する表が存在するスキーマの名前を指定する。自分のスキーマ以外の表を変更するには、ALTER ANY TABLEシステム権限が必要である。スキーマ名の指定を省略した場合は、自分のスキーマ内にある表を変更する。
table
一意キーを追加する表の名前を指定する。
constraint_name
追加する制約の名前を指定する。制約名の指定を省略した場合は、自動的に生成された制約名が暗黙のうちに付けられる。
column_name
一意キーに設定する列の名前を指定する。カンマで区切って複数の列を指定することもできる。
USING INDEX
一意キーに索引を使用する。
TABLESPACE tablespace_name
索引が使用する表領域の名前を指定する。
TABLESPACE DEFAULT
索引はデフォルトの表領域を使用する。
PCTFREE
データベースオブジェクトの各データブロック内で、オブジェクトの行を将来更新するために確保しておく領域の割合をパーセント単位で指定する。読み取り専用の表であれば0でも構わない。
PCTUSED
使用済み領域のうち、データベースオブジェクトのデータブロックごとに確保される最小限の割合をパーセント単位で指定する。

テーブルに外部キー制約を追加する

ALTER TABLE [schema.]table
ADD [COSTRAINT constraint_name]
FOREIGN KEY (column_name [,column_name...])
REFERENCES [schema.]object [(column_name [,column_name...])]
schema
変更する表が存在するスキーマの名前を指定する。自分のスキーマ以外の表を変更するには、ALTER ANY TABLEシステム権限が必要である。スキーマ名の指定を省略した場合は、自分のスキーマ内にある表を変更する。
table
外部キーを追加する表の名前を指定する。
constraint_name
追加する制約の名前を指定する。制約名の指定を省略した場合は、自動的に生成された制約名が暗黙のうちに付けられる。
column_name
外部キーに設定する列の名前を指定する。カンマで区切って複数の列を指定することもできる。

表にチェック制約を追加する

ALTER TABLE [schema.]table ADD [COSTRAINT constraint] CHECK (condition)
schema
チェック制約を追加する表が存在するスキーマの名前を指定する。自分のスキーマ以外の表を変更するには、ALTER ANY TABLEシステム権限が必要である。スキーマ名の指定を省略した場合は、自分のスキーマ内にある表を変更する。
table
チェック制約を追加する表の名前を指定する。
constraint
追加する制約の名前を指定する。制約名の指定を省略した場合は、自動的に生成された制約名が暗黙のうちに付けられる。
check
チェックに成功する条件を指定する。

既存の表にチェック制約を追加する例を次に示す。

ALTER TABLE emp ADD CONSTRAINT agecheck (age >= 18);

テーブルにチェック制約を追加する。

ALTER TABLE emp ADD CONSTRAINT check_salary CHECK (salary > 0)

表の制約を無効化する

表の制約を一時的に無効化する。

ALTER TABLE [schema.]table DISABLE CONSTRAINT constraint
schema
表が存在するスキーマの名前
table
制約を無効化する表の名前
constraint
無効化する制約の名前

表の制約を無効化する例を次に示す。

ALTER TABLE emp DISABLE CONSTRAINT agecheck;

表の制約を有効化する

無効化した制約を有効化する。

ALTER TABLE [schema.]table ENABLE CONSTRAINT constraint
schema
表が存在するスキーマの名前
table
制約を有効化する表の名前
constraint
有効化する制約の名前

表の制約を有効化する例を次に示す。

ALTER TABLE emp ENABLE CONSTRAINT agecheck;

表から制約を削除する

既存の表から制約を削除する。

ALTER TABLE [schema.]table DROP CONSTRAINT constraint
schema
表が存在するスキーマの名前
table
制約を削除する表の名前
constraint
削除する制約の名前

既存の表からCHECK制約を削除する例を次に示す。

ALTER TABLE emp DROP CONSTRAINT agecheck;

テーブルからチェック制約を削除する。

ALTER TABLE emp DROP CONSTRAINT check_salary

関連SQL

MySQL

MySQL の表を変更する。

ALTER TABLE tbl_name
  [alter_option [, alter_option] ...]

PostgreSQL

PostgreSQL の表を変更する。

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ]

参考文献

Oracle 2023. ALTER TABLE ステートメント

The PostgreSQL Global Development Group 2022. ALTER SEQUENCE