我不确定在阅读了所有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
实际上,我尝试在多个表中使用更多的条件来实现复杂得多的唯一性条件,但是由于即使在创建索引的开始阶段也会出现问题,所以我希望首先了解这一点
2条答案
按热度按时间i1icjdpr1#
虽然你可以在表达式上建立索引,但我不认为你可以引用其他行或进行查询。检查约束也一样。你需要一个触发器,就像Postgresql检查文档所说的...
如果您需要在插入行时对其他行进行一次性检查,而不是持续维护一致性保证,则可以使用定制触发器来实现这一点。(这种方法避免了转储/恢复问题,因为pg_dump在恢复数据之前不会重新安装触发器,因此在转储/恢复期间不会强制执行检查。)
yftpprvb2#
不,这是不可能的。唯一性是一个应用于一组行的标准,无论它们的顺序或插入时间如何,它不区分“新行”并将其与“现有行”进行比较。
要实现这一点,您需要使用trigger,它可以根据最大日期检查插入/更新的行。
另一种方法是对某个日期范围使用排除约束,并使插入的每一行都涵盖自上次插入以来的范围,以防止插入日期在此之前的其他行。