PostgreSQL では一意性制約を追加しても、重複してNULL値を保存することが出来る

More than 1 year has passed since last update.


概要

PostgreSQL では、列に対して一意性制約を追加した場合でも重複して NULL値を保存出来ます。

この振る舞いは NULL 値同士では、比較出来ないためです。


実際に試してみる

下記の状態のデータに対して id を重複させた場合と NULL値を重複させた場合の挙動を確認してみました。

:arrow_down: スキーマの状態です。

sample=# \d users;

Table "public.users"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
name | text | | |
Indexes:
"users_id_key" UNIQUE CONSTRAINT, btree (id)

:arrow_down: データの状態です。

sample=# SELECT * FROM users;

id | name
----+-------
1 | alpha
| beta
(2 rows)


id を重複させた場合

sample=# INSERT INTO users (id, name) VALUES(1, 'gamma');

ERROR: 重複キーが一意性制約"users_id_key"に違反しています
DETAIL: キー (id)=(1) はすでに存在します

一意性制約に違反し、エラーが発生しました。


NULL値を重複させた場合

sample=# INSERT INTO users (id, name) VALUES(NULL, 'gamma');

INSERT 0 1
sample=# SELECT * FROM users;
id | name
----+-------
1 | alpha
| beta
| gamma
(3 rows)

一意性制約に違反しなかったため、インサートが成功しました。


参考資料

https://www.postgresql.org/docs/10/static/indexes-unique.html


バージョン情報


  • PostgreSQL 10.1