[PostgreSQL] NULLS NOT DISTINCT

UNIQUE Index๋Š” ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ๊ตฌ๋ฉ๋„ ์žˆ๋‹ค.

ํ…Œ์ด๋ธ”๊ณผ ์œ ๋‹ˆํฌ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.


CREATE TABLE testable (
    id SERIAL PRIMARY KEY,
    age int NULL,
    name TEXT NOT NULL
);

CREATE UNIQUE INDEX uidx_name_age on testable(name, age);

๊ทธ๋Ÿฌ๋ฉด ๋‹น์—ฐํžˆ ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค.

INSERT INTO testable(age, name)
VALUES (10, 'john');

INSERT INTO testable(age, name)
VALUES (10, 'john');

๊ทผ๋ฐ ๋ฌธ์ œ๋Š”, ์œ ๋‹ˆํฌ ์กฐ๊ฑด ์ค‘์— null์ด ํฌํ•จ๋  ๊ฒฝ์šฐ๋‹ค. null์ด ํฌํ•จ๋˜๋ฉด ๊ทธ๊ฑด ์œ ๋‹ˆํฌ ์กฐ๊ฑด์—์„œ ๋ฐฐ์ œ๋œ๋‹ค!


INSERT INTO testable(age, name)
VALUES (NULL, 'john');

INSERT INTO testable(age, name)
VALUES (NULL, 'john');

์˜๋„์น˜ ์•Š์€ ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.




NULLS NOT DISTINCT ์˜ต์…˜

๋‹คํ–‰ํžˆ๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ด ์žˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์€ PostgreSQL 15 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›๋œ๋‹ค.

DROP INDEX uidx_name_age;

CREATE UNIQUE INDEX uidx_name_age on testable(name, age) NULLS NOT DISTINCT;

์œ„์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค ์ƒ์„ฑ์‹œ์— ์˜ต์…˜์„ ์ฃผ๋ฉด, null๋„ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผํ•ด์„œ ์ธ๋ฑ์Šค ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.


๊ทธ๋Ÿฌ๋ฉด ์ด์ œ๋Š” ์ค‘๋ณต ๋ฐฐ์ œ๊ฐ€ ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://www.postgresql.org/about/featurematrix/detail/unique-nulls-not-distinct/
https://stackoverflow.com/questions/8289100/create-unique-constraint-with-null-columns