ORACLE/制約編

オラクルちょこっとリファレンス

HOME > 制約編

制約

制約とは、表にデータを作成(挿入/更新)するときに条件に合わないデータを入力させないための仕組みです。
表の列に制約を掛けることで、データベース側でデータの整合性を取る事が可能になります。

制約の種類

制約には以下の5種類があります

制約名 説明
主キー制約 (PRIMARY KEY) 一意制約とNOT NULL制約の複合
一意制約 (UNIQUE) 重複するフィールドを禁止する
NOTNULL制約 (NOT NULL) NULL値を禁止する
チェック制約 (CHECK) 入力できる値に一定の制約を設ける
外部参照制約 (REFERENCES) 他のテーブルの主キーまたは一意キーを参照する制約

制約の定義方法

制約を定義する方法としては列制約と表制約の2種類があります。


<列制約>

列制約とはその名の通り、表の列(カラム)1つ1つに対して制約を定義する方法です。
以下に例を示します。

列制約サンプル
CREATE TABLE SHAIN_MASTER( ID VARCHAR2(10) PRIMARY KEY, NAME VARCHAR2(10) NOT NULL, TEL VARCHAR2(10) UNIQUE, AGE NUMBER(2) CHECK(AGE BETWEEN 18 AND 65), BUSHO_CD CHAR(2) REFERENCES BUSHO_MASTER(BUSHO_CD) );

このサンプルでは、SHAIN_MASTER表を作成しています。

列(ID)は主キーに設定されているので重複した値はセットする事ができませんし、NULL値をセットする事もできません。列(NAME)は重複した値をセットする事はできますが、NULL値は不可です。

列(TEL)は一意キー制約がかかっているので、重複した値をセットすることができません。但し、NULL値に関してはOKです。(NOT NULL制約の正反対という事ですね。)

列(AGE)はCHECK(条件)で指定した条件に合わない値はセットする事ができません。この場合ですと、AGEには18~65までの数字しかセットする事ができません。

最後に列(BUSHO_CD)は別に存在する表「BUSHO_MASTER」のBUSHO_CD列に存在する値しかセットする事ができません。


<表制約>

表制約では、列1つ1つに対してではなく「○○制約は表の××列に定義しますよ」という感じで制約を定義する方法です。
以下に例を示します。

表制約サンプル
CREATE TABLE SHAIN_MASTER( ID1 VARCHAR2(5), ID2 VARCHAR2(10), NAME VARCHAR2(10), TEL VARCHAR2(10), AGE NUMBER(2), BUSHO_CD CHAR(2), CONSTRAINT cons_p1 PRIMAEY KEY(ID1, ID2), CONSTRAINT cons_u1 UNIQUE(TEL), CONSTRAINT cons_c1 CHECK(AGE BETWEEN 18 AND 65), CONSTRAINT cons_f1 FOREIGN KEY(BUSHO_CD) REFERENCES BUSHO_MASTER(BUSHO_CD) );

まず始めに、NOT NULL制約は表制約で定義できません。列制約でのみ定義できます。

また、特徴として定義した制約に名前を付け制約オブジェクトとして操作する事ができたり、列を複数指定する事ができます。
(列制約でも定義した制約には内部的に名前を付けられていますので、オブジェクトとして操作することはできます。)

各定義の説明は列制約と同じなので、列制約の項目を参照してください。

ただ、各制約に列名をカンマ区切りで複数記述する事ができ、サンプルの主キー制約の例だとID1とID2の2つを合わせた上で 主キー制約を掛けますので、例えばID1が同じでもID2が異なればそのデータは、制約に合致しているということになります。
(主キー制約に限らず、他の制約も同様です。)

制約の追加

既存の表に制約を追加するには ALTER TABLE ~ ADD CONSTRAINT句を使用します。

制約の追加構文
ALTER TABLE テーブル名 ADD CONSTRAINT 制約名 制約(列名);

制約追加の例文
--(例)test_tab表のcol1列にconst1という名称でUNIQUE制約を設定する。 ALTER TABLE test_tab ADD CONSTRAINT const1 unique(col1);

制約の削除

既存の表にある制約を削除するには ALTER TABLE ~ DROP CONSTRAINT句を使用します。

制約の削除構文
ALTER TABLE テーブル名 DROP CONSTRAINT 制約名;

制約削除の例文
--(例)test_tab表に設定されているconst1という名称の制約を削除する。 ALTER TABLE test_tab DROP CONSTRAINT const1;

制約の有効/無効

既存の表にある制約を一時的に有効にしたり無効にしたりするには ALTER TABLE ~ [ENABLE/DISABLE] CONSTRAINT句を使用します。

制約の有効/無効構文
ALTER TABLE テーブル名 [ENABLE/DISABLE] CONSTRAINT 制約名;

制約有効無効の例文
--(例)test_tab表に設定されているconst1という名称の制約を一時的に無効にする。 ALTER TABLE test_tab DISABLE CONSTRAINT const1; --(例)test_tab表に設定されているconst1という名称の制約を一時的に有効にする。 ALTER TABLE test_tab ENABLE CONSTRAINT const1;
ToTop