ALTER TABLEは、既存のテーブルの定義を変更するSQL文である。

目次

テーブルの名前を変更する

ALTER TABLE [schema.]old RENAME new
schema
既存のテーブルが存在するスキーマを指定する。

old
変更前のテーブルの名前を指定する。
new
変更後のテーブルの名前を指定する。

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

ALTER TABLE emp RENAME employee

テーブルに新しいカラムを追加する

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 DROP (column [,column...]) [CASCADE CONSTRAINTS]

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

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

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

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

表に制約を追加する

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

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
使用済み領域のうち、データベースオブジェクトのデータブロックごとに確保される最小限の割合をパーセント単位で指定する。
INITRANS

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

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

カラムの名前を変更する

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 COSTRAINT constraint
table
制約を削除するテーブルを指定する。
constraint
削除する制約を指定する。

ALTER TABLEに必要な権限

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

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

ALTER TABLEのサンプル

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

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

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

ALTER TABLE emp DROP CONSTRAINT check_salary

関連SQL