🗃️
[Postgres] 複数列のうち「どれか一つだけ必須」にする制約
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