今、実は「基本情報技術者試験」に向け、勉強してます。
んで、ちょうどデータベース分野について調べてました。
前回と内容がかぶるんですが、
今回は一意性制約(UNIQUEキー制約)について学んだことを書きますー!
一意性制約(UNIQUEキー制約)とは、、、
- NULL以外の各行を一意に制約する。
- ただし、NOT NULLではないためNULLを許します。
→NULLが複数行存在することもあります。
私「NULL以外を一意にするだけで、NULL許すんだー、結構ゆる〜い。」
そこで気になる記事を見つけました。
複合一意キーにおいてすべてのキー列に対して NULL を持つ行も同様に複数持つことが可能。
ただし、1つ以上のキー列に対して NULL を持ち、その他のキー列に対して同じ組合せの値を持つ 2つの行は制約違反となる。(※)
一意キーは 1 つの表に 複数定義してもよい。
つまり
- 単一列における一意キー制約において NULL が存在して NULL を INSERT してもは制約に違反しない。
- 複合列における一意キー制約において
(NULL,NULL) ⇔ (NULL,NULL) は制約に違反しないが
(NULL,1000) ⇔ (NULL,1000) は一意キー制約違反となる。
(1000,NULL,NULL) ⇔ (1000,NULL,NULL) も同様に違反となる。 (※)
ん?
よくわかんないのでやってみる。(バカです、はい)
※大好きなphpPgAdminでやってます。
CREATE TABLE id_number_unique_key_table( id integer UNIQUE, number integer UNIQUE ); INSERT INTO id_number_unique_key_table VALUES(NULL, NULL); INSERT INTO id_number_unique_key_table VALUES(NULL, NULL);
うんうん、いける!
カラムid,number両方において、同じNULLです。
一見、ユニークじゃないのにいいの?ってなるけど、
一意性制約はNULL以外に関しての制約なのでいいのです。
前回の復習をすると、ユニークだけどNULL(プライマリキーではない)だから、
レコードの識別ができないため、削除/編集ができない。
しかし、以下の文は一意性制約違反です。
INSERT INTO id_number_unique_key_table VALUES(NULL, 1000); INSERT INTO id_number_unique_key_table VALUES(NULL, 1000);
( ー`дー´)/ダメッ てされる。
カラムnumberにおいて、1000,1000でかぶってますもんね。
一意ではないです。
NULLでもないです。
だから怒られちゃうんです。
もちろんこれはできます!
INSERT INTO id_number_unique_key_table VALUES(NULL, 1000); INSERT INTO id_number_unique_key_table VALUES(NULL, 2000);
カラムid.number両方とも、NULLかユニークです。
ユニークキー(一意性制約)はNULLかユニークであれば違反ではない!