限制两个特定列值同时存在

Nat*_*ppi 3 postgresql database-design constraint exclusion-constraint postgresql-9.3

我有一个 PostgreSQL 示例表,其中最多允许有一行不是“c”类型的行。

我将不胜感激任何帮助创建一个强制执行这一点的约束。

CREATE TABLE example
(
  example_id    serial PRIMARY KEY,
  example_state CHAR(1) NOT NULL
);

ALTER TABLE example ADD CONSTRAINT 
  example_constraint
CHECK (example_state = 'a' OR example_state = 'b' OR example_state = 'c');
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

每种稀有类型占一行

如果您希望允许类型为“c”的 0-n 行,而类型“a”和“b”(每个)仅允许 0-1 行,则可以将简单约束CHECK部分唯一索引相结合:

CREATE TABLE example (
  example_id    serial PRIMARY KEY,
  example_state "char" NOT NULL CHECK (example_state IN ('a', 'b', 'c'))
);

CREATE UNIQUE INDEX example_unique_exception_idx ON example (example_state)
WHERE example_state <> 'c'; -- column is not null;
Run Code Online (Sandbox Code Playgroud)

相关回答:

排除约束是一个相关概念,但它不适用于 的多个条目'c'。您可以使用NULL“c”来代替“c”来完成这项工作。

另请注意特殊的数据类型"char"(用双引号!),这似乎非常适合您的简单目的(除非它只是为了问题的目的而简化)。它只占用一个字节 - 与 不同char(1),后者在磁盘上至少需要 2 个字节,在 RAM 中至少需要 5 个字节。

具有任何稀有类型的单例行

要限制为不具有类型“c”的单个行,请在表达式上使用部分唯一索引

CREATE UNIQUE INDEX example_single_exception_idx ON example ((example_state <> 'c'))
WHERE example_state <> 'c';
Run Code Online (Sandbox Code Playgroud)