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)
如果您希望允许类型为“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)
| 归档时间: |
|
| 查看次数: |
3147 次 |
| 最近记录: |