🗃️

[Postgres] 複数列のうち「どれか一つだけ必須」にする制約

2024/06/24に公開

PostgreSQL で複数カラムのうち「いずれか一つだけ入力必須」を実現する制約の例です。

もっといいやり方があるかもですが、とりあえずは CHECK constraint を使ってこの形で実現できました。

Postgres 自由すぎて便利。

CREATE TABLE check_constraint_example (
	col_a TEXT NOT NULL DEFAULT '',
	col_b TEXT NOT NULL DEFAULT '',
	CHECK (((col_a != '') AND (col_b = '')) OR ((col_a = '') AND (col_b != '')))
);
-- Query 1 OK: CREATE TABLE

INSERT INTO check_constraint_example VALUES ('a', '');
-- Query 1 OK: INSERT 0 1, 1 row affected

INSERT INTO check_constraint_example VALUES ('', 'b');
-- Query 1 OK: INSERT 0 1, 1 row affected

INSERT INTO check_constraint_example VALUES ('a', 'b');
-- Query 1 ERROR at Line 1: : ERROR:  new row for relation "check_constraint_example" violates check constraint "check_constraint_example_check"
-- DETAIL:  Failing row contains (a, b).

INSERT INTO check_constraint_example VALUES ('', '');
-- Query 1 ERROR at Line 1: : ERROR:  new row for relation "check_constraint_example" violates check constraint "check_constraint_example_check"
-- DETAIL:  Failing row contains (, ).

Discussion