※※※ 制約概念について ※※※
- ※列制約と表制約
制約 には「列制約」と「テーブル制約」という 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 制約名;