SQLのCONSTRAINTとは、データの整合性を担保するために、表の列に入れられる値を制限する規則です。データを挿入または更新するときに整合性制約がチェックされ、違反する場合はエラーが発生します。
整合性制約には次の種類がある。
整合性制約 | 説明 |
---|---|
NOT NULL | この制約が付けられた列は、必ず値を挿入しなければならない(NULLにできない)。 |
PRIMARY KEY | 主キー制約。NOT NULLとUNIQUEの両方の制約が付く。 また、インデックスが自動的に作成される。 |
UNIQUE | 一意制約。この制約が付けられた列は値が一意でなければならず、重複した値を挿入できない。 |
FOREIGN KEY | 外部キー制約。他のテーブル等に存在する値しか挿入できない。 |
CHECK | チェック制約。任意のチェック条件を指定できる。 |
PRIMARY KEY制約が付けられた列には、必ず値を挿入しなければならない(NULLにできない)。また、PRIMARY KEY制約が付けられた列は値が一意でなければならず、重複した値を挿入できない。つまり、NOT NULL制約とUNIQUE制約の両方を指定したことになる。
CREATE TABLE dept (
deptno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2(13)
);
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制約を使うと、任意の条件式を指定できる。
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
表の制約を無効化する例を次に示す。
ALTER TABLE emp DISABLE CONSTRAINT agecheck;
無効化した制約を有効化する。
ALTER TABLE [schema.]table ENABLE CONSTRAINT 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)
既存の表にチェック制約を追加する例を次に示す。
ALTER TABLE emp ADD CONSTRAINT agecheck (age BETWEEN 18 AND 65);
既存の表から制約を削除できる。
ALTER TABLE [schema.]table DROP COSTRAINT constraint
既存の表からCHECK制約を削除する例を次に示す。
ALTER TABLE emp DROP CONSTRAINT agecheck;
整合性制約を操作するSQL文の一覧を次に示す。
整合性制約に関する情報は、次のデータ・ディクショナリ・ビューで参照できる。