SQL CONSTRAINT の使い方

SQLのCONSTRAINTとは、データの整合性を担保するために、表の列に入れられる値を制限する規則です。データを挿入または更新するときに整合性制約がチェックされ、違反する場合はエラーが発生します。

整合性制約の種類

整合性制約には次の種類がある。

整合性制約の一覧
整合性制約 説明
NOT NULL この制約が付けられた列は、必ず値を挿入しなければならない(NULLにできない)。
PRIMARY KEY 主キー制約。NOT NULLとUNIQUEの両方の制約が付く。
また、インデックスが自動的に作成される。
UNIQUE 一意制約。この制約が付けられた列は値が一意でなければならず、重複した値を挿入できない。
FOREIGN KEY 外部キー制約。他のテーブル等に存在する値しか挿入できない。
CHECK チェック制約。任意のチェック条件を指定できる。

PRIMARY KEY

PRIMARY KEY制約が付けられた列には、必ず値を挿入しなければならない(NULLにできない)。また、PRIMARY KEY制約が付けられた列は値が一意でなければならず、重複した値を挿入できない。つまり、NOT NULL制約とUNIQUE制約の両方を指定したことになる。

CREATE TABLE dept (
  deptno NUMBER(2) PRIMARY KEY,
  dname VARCHAR2(14),
  loc VARCHAR2(13)
);

FOREIGN KEY

FOREIGN KEY制約が付けられた列には、指定した表の列に存在する値しか入れることができない。これは外部キー制約と呼ばれる。

CREATE TABLE emp (
  empno NUMBER(4) PRIMARY KEY,
  ename VARCHAR2(10),
  job VARCHAR2(9),
  mgr NUMBER(4),
  hiredate DATE,
  sal NUMBER(7,2),
  comm NUMBER(7,2),
  deptno NUMBER(2),
  FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE CASCADE
);

CHECK

CHECK制約を使うと、任意の条件式を指定できる。

CREATE TABLE emp (
  empno NUMBER(4) PRIMARY KEY,
  ename VARCHAR2(10),
  job VARCHAR2(9),
  mgr NUMBER(4),
  hiredate DATE,
  sal NUMBER(7,2),
  comm NUMBER(7,2),
  age NUMBER(2),
  deptno NUMBER(2),
  CONSTRAINT agecheck CHECK(age BETWEEN 18 AND 65)
);

CHECK制約に違反する行を挿入または更新しようとすると、エラーが発生する。

行1でエラーが発生しました。:
ORA-02290: チェック制約(XXXX.AGECHECK)に違反しました

表の制約を無効化する

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

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 ADD CONSTRAINT constraint PRIMARY KEY (columns)
ALTER TABLE [schema.]table ADD CONSTRAINT constraint UNIQUE (columns)
ALTER TABLE [schema.]table ADD CONSTRAINT constraint FOREIGN KEY (column) REFERENCES reftable(column)
ALTER TABLE [schema.]table ADD CONSTRAINT constraint CHECK (condition)
schema
表が存在するスキーマの名前
table
制約を追加する表の名前
constraint
追加する制約の名前

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

ALTER TABLE emp ADD CONSTRAINT agecheck (age BETWEEN 18 AND 65);

表から制約を削除する

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

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

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

ALTER TABLE emp DROP CONSTRAINT agecheck;

整合性制約に関するSQL文

整合性制約を操作するSQL文の一覧を次に示す。

CREATE TABLE
テーブルを作成する。
ALTER TABLE
テーブルを変更する。
CREATE VIEW
ビューを作成する。
ALTER VIEW
ビューを変更する。

整合性制約に関するデータ・ディクショナリ

整合性制約に関する情報は、次のデータ・ディクショナリ・ビューで参照できる。

ALL_CNSTRAINTS
現在のユーザがアクセスできる整合性制約を示す。
DBA_CONSTRAINTS
Oracleデータベース内すべての整合性制約を示す。
USER_CONSTRAINTS
現在のユーザが所有する整合性制約を示す。