CHECK 制約

「アプリケーション層の validation は、不正値入力の『通知』に留め」

「データの整合性 はデータ層が担保しよう」

って Dan Chak さんが言ってた(覚えがあるので要復習)


CREATE TABLE users (
  name text NOT NULL,
  receivemailflag INTEGER NOT NULL DEFAULT 1,
  CHECK (receivemailflag IN (0, 1))
);

INSERT INTO users VALUES ('yamada', 0);
INSERT 0 1

INSERT INTO users VALUES ('shimano', 0);
INSERT 0 1

INSERT INTO users VALUES ('whoareyou', -1);
ERROR:  new row for relation "users" violates check constraint "users_receivemailflag_check"
DETAIL:  Failing row contains (whoareyou, -1).

INSERT INTO users VALUES ('whoa!', 2);
ERROR:  new row for relation "users" violates check constraint "users_receivemailflag_check"
DETAIL:  Failing row contains (whoa!, 2).

INSERT INTO users values ('noo', null);
ERROR:  null value in column "receivemailflag" violates not-null constraint
DETAIL:  Failing row contains (noo, null).

SELECT * FROM users;
  name   | receivemailflag 
---------+-----------------
 yamada  |               0
 shimano |               1
(2 rows)