假设我有这样的表:
CREATE TABLE foo (
id SERIAL PRIMARY KEY
, barid integer NOT NULL REFERENCES bar(id)
, bazid integer NOT NULL REFERENCES baz(id)
, startdate timestamp(0) NOT NULL
, enddate timestamp(0) NOT NULL
);
该表的目的是提供表 bar 和 baz 之间的伪“一对多”关系,但这种关系会随着时间而改变:
SELECT * FROM bar
JOIN foo on TRUE
AND foo.barid = bar.id
AND now() BETWEEN foo.startdate AND foo.enddate
JOIN baz on baz.id = foo.bazid
我们可以想象,对于表中的某一行,bar
我们想在baz
表中找到对应的行,但对应的行在不同的时间段可能不同——所以它现在应该返回不同的行,上个月不同等。
现在我的问题是:验证此表中数据完整性的最佳方法是什么?具体来说,我需要确定,对于某个时间戳,表中只有foo
一行foo.barid
. 我知道我可以写一个触发器(这似乎是我现在唯一的选择),但也许有人有一个更简单的想法?我正在考虑使用某种部分索引,但我不确定如何编写条件......