postgresql 根据要添加的值在多个列上创建唯一性索引postgres 9.6

uinbv5nw  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(210)

我不确定在阅读了所有postgres文档之后我的查询是否可以执行,但是我想问一下是否可以编写一个唯一性索引,以便它不仅认为那些与现有值相等的值是唯一的,而且例如,如果一个新记录被添加的日期小于或等于具有相同id的现有记录?

CREATE UNIQUE INDEX my_unique_index
    ON my_table (id, currentDate)
    WHERE currentDate < NEW.currentDate

因此INSERT的行为如下所示:

INSERT INTO my_table (id, currentDate) VALUES 
(0, '12.21.2022'), - succefull added
(0, '12.24.2022'), - succefull added
(0, '12.23.2022'), - unique error
(1, '12.24.2022') - succefull added

实际上,我尝试在多个表中使用更多的条件来实现复杂得多的唯一性条件,但是由于即使在创建索引的开始阶段也会出现问题,所以我希望首先了解这一点

i1icjdpr

i1icjdpr1#

虽然你可以在表达式上建立索引,但我不认为你可以引用其他行或进行查询。检查约束也一样。你需要一个触发器,就像Postgresql检查文档所说的...
如果您需要在插入行时对其他行进行一次性检查,而不是持续维护一致性保证,则可以使用定制触发器来实现这一点。(这种方法避免了转储/恢复问题,因为pg_dump在恢复数据之前不会重新安装触发器,因此在转储/恢复期间不会强制执行检查。)

yftpprvb

yftpprvb2#

不,这是不可能的。唯一性是一个应用于一组行的标准,无论它们的顺序或插入时间如何,它不区分“新行”并将其与“现有行”进行比较。
要实现这一点,您需要使用trigger,它可以根据最大日期检查插入/更新的行。
另一种方法是对某个日期范围使用排除约束,并使插入的每一行都涵盖自上次插入以来的范围,以防止插入日期在此之前的其他行。

相关问题