ALTER TABLEとは、既存の表定義を変更するSQL文です。以下に示す表定義を変更できます。
自分のスキーマ内にある表の定義を変更するには、とくに権限は必要ない。
他のスキーマ内にある表の定義を変更するには、ALTER ANY TABLEシステム権限が必要である。
ALTER TABLE [schema.]old RENAME 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]...)
列を追加する表のスキーマを指定する。スキーマの指定を省略した場合は、自分のスキーマ内の表が対象となる。
列を追加する表を指定する。
追加する列の名前を指定する。
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
empテーブルのsalカラムの名前をsalaryに変更する例を示す。
ALTER TABLE emp RENAME COLUMN sal TO salary
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]]
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]]
ALTER TABLE [schema.]table
ADD [COSTRAINT constraint_name]
FOREIGN KEY (column_name [,column_name...])
REFERENCES [schema.]object [(column_name [,column_name...])]
ALTER TABLE [schema.]table ADD [COSTRAINT constraint] CHECK (condition)
既存の表にチェック制約を追加する例を次に示す。
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
表の制約を無効化する例を次に示す。
ALTER TABLE emp DISABLE CONSTRAINT agecheck;
無効化した制約を有効化する。
ALTER TABLE [schema.]table ENABLE CONSTRAINT constraint
表の制約を有効化する例を次に示す。
ALTER TABLE emp ENABLE CONSTRAINT agecheck;
既存の表から制約を削除する。
ALTER TABLE [schema.]table DROP CONSTRAINT constraint
既存の表からCHECK制約を削除する例を次に示す。
ALTER TABLE emp DROP CONSTRAINT agecheck;
テーブルからチェック制約を削除する。
ALTER TABLE emp DROP CONSTRAINT check_salary
MySQL の表を変更する。
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
PostgreSQL の表を変更する。
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ]
Oracle 2023. ALTER TABLE ステートメント
The PostgreSQL Global Development Group 2022. ALTER SEQUENCE