gpt4 book ai didi

sql - postgres 可以检查*有条件地*限制重复项吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:13 24 4
gpt4 key购买 nike

我必须实现一条规则,即只有一个具有给定 ID 的“组”一次可以具有“进行中”或“问题”状态。是否可以在 Postgres 检查中表示这一点,或者我必须求助于应用程序中的逻辑?

例如:

INSERT INTO group (group_id, status) VALUES (1, 'In Progress'); -- okay
INSERT INTO group (group_id, status) VALUES (2, 'Problem'); -- okay
INSERT INTO group (group_id, status) VALUES (3, 'In Progress'); -- okay
INSERT INTO group (group_id, status) VALUES (4, 'Problem'); -- okay
INSERT INTO group (group_id, status) VALUES (1, 'Something else'); -- okay
INSERT INTO group (group_id, status) VALUES (2, 'Foo bar'); -- okay

INSERT INTO group (group_id, status) VALUES (1, 'In Progress'); -- should fail
INSERT INTO group (group_id, status) VALUES (1, 'Problem'); -- should fail
INSERT INTO group (group_id, status) VALUES (2, 'In Progress'); -- should fail
INSERT INTO group (group_id, status) VALUES (2, 'Problem'); -- should fail

最佳答案

我认为您需要一个部分唯一索引。

CREATE UNIQUE INDEX group_status_unq_idx 
ON "group"(group_id, status) WHERE (status IN ('In Progress', 'Problem'));

但是,根据您的描述,我不清楚为什么第二个预期失败会失败。对于任何给定的 group_id,您是否希望仅允许 In ProgressProblem 之一?如果是这样,你可以这样写:

CREATE UNIQUE INDEX group_status_unq_idx
ON "group"(group_id) WHERE (status IN ('In Progress', 'Problem'));

... 从部分唯一索引中省略 status 并将其仅用于谓词。参见 this SQLFiddle .

请注意,这不能表示为 UNIQUE 约束,因为唯一约束不采用谓词。 PostgreSQL 唯一约束是使用(非部分)UNIQUE 索引实现的,但它还会创建仅创建索引不会创建的元数据条目。部分唯一索引的工作方式类似于带有谓词的唯一约束,但它不会通过 information_schema 的约束信息等元数据发现。

关于sql - postgres 可以检查*有条件地*限制重复项吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com