Oracle管理者のためのSQLリファレンス

制約の確認/作成/削除

表の各列には整合性制約と呼ばれるルールを指定できます。整合性制約は5つあります。

NOT NULL制約
列の値がNULLでないこと。列に必ず値を入力しなければなりません。

一意キー制約(UNIQUE制約)
列のすべての値が一意であること。指定した列で値が重複することは許されません。ただしNULLは複数存在することが許されます(NULLはどの値とも等しいと見なされない)。

主キー制約(PRIMARY KEY制約)
その列が行を一意に識別できること。表には、主キー制約を最大1つ指定できます。主キー制約では、値は重複してはならず、またNULLも許可されません。

参照整合性制約(REFERENCES制約)
関連付けられた表の共通する列の関係が保たれていること。参照整合性制約では、表の各行の外部キー値は、親表の値と一致していなければなりません。外部キー制約とも呼ばれます。

CHECK制約
列の値が指定した条件を満たすこと。列の値は、CHECK制約で指定した条件に対しTRUEまたはUNKNOWNでなければなりません。

(SQLの表記ルールは、こちらから参照できます)

制約の定義を確認する
SELECT * FROM user_constraints;
-- または
SELECT * FROM all_constraints;
-- または
SELECT * FROM dba_constraints;
制約の定義を確認するには、USER_CONSTRAINTSまたはALL_CONSTRAINTSまたはDBA_CONSTRAINTSを参照します。USER_CONSTRAINTSでは現行ユーザーが所有している制約定義が表示されます。ALL_CONSTRAINTSでは現行ユーザーがアクセス可能な制約定義が表示されます。DBA_CONSTRAINTSではデータベース内のすべての制約定義が表示されますが、このビューにアクセスするにはSELECT ANY TABLE権限が必要です。この権限は、デフォルトでDBAロールに割り当てられます。
関連項目:表の確認/作成/変更/削除

表の作成時に表内指定で制約を作成する
CREATE [GLOBAL TEMPORARY] TABLE [schema .]table (
  column datatype CONSTRAINT constraint_name NOT NULL,
  column datatype CONSTRAINT constraint_name UNIQUE,
  column datatype CONSTRAINT constraint_name PRIMARY KEY,
  column datatype CONSTRAINT constraint_name REFERENCES
    [schema .]object
    [(column)]
    [ON DELETE {CASCADE | SET NULL}],
  column datatype CONSTRAINT constraint_name
    CHECK (condition)
);
表の作成時に表内指定で制約を作成するには、CREATE TABLE文で列を指定する際に、列名、データ型に続けてCONSTRAINT句で制約名(constraint_name)、制約の種類(NOT NULL、UNIQUE、PRIMARY KEY、REFERENCES、CHECK)を指定します。NOT NULL制約は表内指定でのみ作成できます。参照整合性制約(REFERENCES)では参照する表の列名を指定します。CHECK制約では「column > 0」のような条件式を指定します。
関連項目:リレーショナル表を作成する 表の作成時に表外指定で制約を作成する 制約を削除する

表の作成時に表外指定で制約を作成する
CREATE [GLOBAL TEMPORARY] TABLE [schema .]table
(column datatype
 [, column datatype …]
)
CONSTRAINT constraint_name{
    UNIQUE (column [, column …]) |
    PRIMARY KEY (column [, column …]) |
    FOREIGN KEY (column [, column …]) |
      [schema .]object
      [(column)]
      [ON DELETE {CASCADE | SET NULL}] |
    CHECK (condition)
};
表の作成時に表外指定で制約を作成するには、CREATE TABLE文で列を指定した後に、CONSTRAINT句で制約名(constraint_name)、制約の種類(UNIQUE、PRIMARY KEY、REFERENCES、CHECK)を指定します。NOT NULL制約は表外指定では作成できません。参照整合性制約(REFERENCES)では参照する表の列名を指定します。CHECK制約では「column > 0」のような条件式を指定します。
関連項目:リレーショナル表を作成する 表の作成時に表内指定で制約を作成する 制約を削除する

表に制約を追加する
ALTER TABLE [schema.]table
ADD CONSTRAINT constraint_name{
    UNIQUE (column [, column …]) |
    PRIMARY KEY (column [, column …]) |
    FOREIGN KEY (column [, column …]) |
      [schema .]object
      [(column)]
      [ON DELETE {CASCADE | SET NULL}] |
    CHECK (condition)
};
表の作成後に制約を追加するには、ALTER TABLE 文のADD CONSTRAINT句を使用して制約を指定します。指定方法は「表の作成時に表内指定で制約を作成する」と同じです。ただし、この方法ではNOT NULL制約は追加できないので、「表にNOT NULL制約を追加する」の方法を使用します。
関連項目:表の作成時に表内指定で制約を作成する 表にNOT NULL制約を追加する 制約を削除する

表にNOT NULL制約を追加する
ALTER TABLE [schema.]table MODIFY (column NOT NULL);
表の作成後にNOT NULL制約を追加するには、ALTER TABLE 文のMODIFY句を使用して、列名(column)にNOT NULLを指定します。
関連項目:表に制約を追加する 制約を削除する

制約を削除する
ALTER TABLE [schema.]table
DROP {PRIMARY KEY | UNIQUE (column [, column] …)}
[CASCADE];
-- または
ALTER TABLE [schema.]table
DROP CONSTRAINT constraint
[CASCADE];
制約を削除するには、ALTER TABLE 文のDROP句を使用します。主キー制約(PRIMARY KEY制約)は表に1つしかないので列名の指定は不要です。一意キー制約(UNIQUE制約)は削除する列名(column)を指定します。それ以外の制約は、CONSTRAINT句に続けて削除する制約名(constraint)を指定します。

CASCADE句
削除する整合性制約に依存するほかの整合性制約もすべて削除するには、CASCADE句を指定します。参照整合性制約(REFERENCES制約)の一部である主キー制約(PRIMARY KEY制約)または一意キー制約(UNIQUE制約)を削除する場合は、CASCADE句を使用して外部キーをともに削除します。

関連項目:表の作成時に表内指定で制約を作成する 表の作成時に表外指定で制約を作成する 表に制約を追加する

Oracle管理者のためのSQLリファレンス



   Oracle関連記事リンク集


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間