制約

※※※  制約概念について  ※※※

  • ※列制約と表制約

     制約 には「列制約」「テーブル制約」という 2つの基本制約がある。
     「列制約」と「テーブル制約」の違い:列制約が列のみに適用されるのに対し、テーブル制約が列のグループに適用されるということ。

     CREATE TABLE 文で、
     列制約は、列定義のデータ型の後ろに列制約を追加し、最後にカンマを付ける。
     テーブル制約は、テーブル定義の最後の列定義の後ろに配置し、最後に閉じカッコをつける。

CREATE TABLE テーブル名
(列名 データ型 列制約….,
……………………,
……………………,
テーブル制約) ;


※※※  制約構文、違いについて  ※※※

  • 主キーの指定(PRIMARY KEY)

     特定の列、または列の組み合わせによって、テーブルに1つのみ宣言。
     PRIMARY KEYとして宣言された列または列の組み合わせには、重複しない値を格納することが必須。(NULL を持たない)
     索引が存在しなければ自動作成される。

CREATE TABLE テーブル名
(
社員番号 INTEGER PRIMARY KEY ,
社員名前   CHAR(20) ,
部署コード CHAR(4) ,
誕生日  CHAR(8) ,
備考 INTEGER
) ;


テーブル制約を用いることで、主キーを 複数の列に指定できる

CREATE TABLE テーブル名
(
社員番号 INTEGER ,
社員名前   CHAR(20) ,
部署コード CHAR(4) ,
誕生日   CHAR(8) ,
備考 INTEGER,
PRIMARY KEY(販売店コード , 商品コード)
) ;


  例:テーブル一覧で確認の上、削除したばかりのテーブルを削除する
   SQL> SELECT * FROM tab;   テーブル一覧

   SQL> DROP TABLE 削除テーブル名 CASCADE CONSTRAINTS;   テーブル削除

  ※CASCADE CONSTRAINTS句で、参照された制約も削除する。 

  •  一意性制約 (UNIQUE) 

     レコードを一意に識別できる。
     索引が存在しなければ自動作成される。

     UNIQUE 制約とPRIMARY KEY 制約と異なる点:
     PRIMARY KEY 制約は、あるテーブルの 1つの列または複数の列に1度だけ使用できるが、UNIQUE 制約は何度でも使用できる。
     PRIMARY KEY 制約を持つ列には NULL が含まれないが、UNIQUE 制約を持つ列には NULL が含まれる可能性がある。

CREATE TABLE テーブル名
(
社員番号 INTEGER PRIMARY KEY ,
社員名前   CHAR(20) UNIQUE,
部署コード CHAR(4) ,
誕生日 CHAR(8) ,
備考 INTEGER
) ;

テーブル制約とすることで、複数の列の組合せの一意性を保つことができる

CREATE TABLE テーブル名
(
社員番号 INTEGER PRIMARY KEY ,
社員名前   CHAR(20) ,
部署コード CHAR(4) ,
誕生日 CHAR(8) ,
備考 INTEGER,
UNIQUE (社員名前,登録日時 )
) ;

  •  NOT NULL制約 

     NOT NULL 制約を使用することで、列に NULL が許可されるのを防ぐことができる。
     ※この制約は列に対してのみ使用できる。

CREATE TABLE テーブル名
(
社員番号 INTEGER PRIMARY KEY ,
社員名前   CHAR(20) UNIQUE NOT NULL ,
部署コード CHAR(4) ,
誕生日 CHAR(8) ,
備考 INTEGER
) ;

  •  列値の確認(CHECK) 

     データを追加、更新する際の有効なデータを定義する規則。
     指定した条件に対して偽(FALSE)である場合、DML文はロールバックされる。
     どの場合、使うか?
      例えば、
       入力したデータが正しい範囲内であるか、
       正しいフォーマットになっているかなど、テーブルに入力するデータを必要に応じて制約をしたい場合。
      制限することにより、
       入力ミス防げる。

CREATE TABLE テーブル名
(
社員番号 INTEGER PRIMARY KEY ,
社員名前   CHAR(20) ,
部署コード CHAR(4) CHECK(部署コード = 10),
誕生日  CHAR(8) ,
備考 INTEGER
) ;

CHECK 制約はテーブル制約として利用できる
CREATE TABLE テーブル名
(
社員番号 INTEGER PRIMARY KEY ,
社員名前   CHAR(20) ,
部署コード CHAR(4) ,
誕生日  CHAR(8) ,
備考 INTEGER,
CHECK(誕生日 >= 19990101 OR 商品コード = '1111')
) ;

     ※補足:

  •  FOREIGN KEY 制約 

     FOREIGN KEY 制約は、外部キーと親キーに参照整合性の原則を守らせるために、ユーザがデータベースに入力できる値を制限する。
     FOREIGN KEY 制約の適用には、親キーにまだ存在しない値をはじくように、外部キー列を制限するという効果がある。
     FOREIGN KEY 制約には、参照する親キーを指定する。
     テーブル制約または列制約となり、テーブルの場合は複数の列を 1つの外部キーとして使用することができる。
     列制約では FOREIGN KEY という単語含まれていない。

テーブル制約
FOREIGN KEY 列リスト REFERENCES 親テーブル(列リスト) ;


列制約
blue| REFERENCES 親テーブル(列リスト) ;##


※※ついでに

  •  制約定義確認のSQL文 

※補足:現行ユーザーが所有している制約定義が表示される
SQL> SELECT * FROM user_constraints; 


※補足:現行ユーザーがアクセス可能な制約定義が表示される
SQL> SELECT * FROM all_constraints;

※説明:データベース内のすべての制約定義が表示される
SQL> SELECT * FROM dba_constraints;

  •  制約の追加 

     ※補足:
     ALTER TABLE ADD CONSTRAINT~は列に制約を追加する。
     制約を追加する場合、既存データがその制約条件を満たしていないと追加できない。
     CHECK制約の条件を変更する場合はCHECK制約を削除後、再定義する。

 ALTER TABLE 表名
ALTER TABLE 表名
ADD CONSTRAINT 制約名 制約(列名);

  •  制御の削除 

     ※補足:
     ALTER TABLE DROP CONSTRAINT~は制約を削除する。

  ALTER TABLE 表名
DROP CONSTRAINT 制約名;

  •  制約の無効、有効 

     ※まだ決定ではない場合、削除より無効が良いかも。

     無効構文
     ※補足:
     ALTER TABLE DISABLE CONSTRAINT~は制約を無効にする。制約の定義は削除されない。

 ALTER TABLE 表名
DISABLE CONSTRAINT 制約名;

     有効構文
     ※補足:
      ALTER TABLE ENABLE CONSTRAINT~は無効にした制約を有効にする。

 ALTER TABLE 表名
ENABLE CONSTRAINT 制約名;


Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License