[英]Exclusion constraint across two tables
我有两个表存储两个不同应用程序实体的数据。 两个实体都有一些公共字段,特别是父实体的外键和日期范围字段。 我可以在每个表上创建一个排除约束,以确保同一父实体的日期范围不重叠,但我需要将此约束应用于两个组合的表。 有没有办法可以在数据库级别实现这一点?
我以为我可以创建一个仅包含 parent_id 和 daterange 列以及排除约束的附加表,并在插入/更新/删除行时在上述两个表上添加触发器,但如果有的话,我对更简单的解决方案感兴趣一!
如果您希望设计保持当前状态,那么带触发器的解决方案可能是唯一的解决方案。
如果你愿意重新设计,你可以 model 这样的数据:
-- for the exclusion constraint
CREATE EXTENSION btree_gist;
CREATE TABLE parent (
pid bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY
);
CREATE TABLE ranges (
rid bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
pid bigint NOT NULL REFERENCES parent (pid),
arange daterange NOT NULL,
PRIMARY KEY (pid, rid),
EXCLUDE USING gist (pid WITH =, arange WITH &&)
);
CREATE TABLE child1 (
c1id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
pid bigint NOT NULL REFERENCES parent (pid),
rid bigint NOT NULL,
FOREIGN KEY (rid, pid) REFERENCES ranges (rid, pid)
);
CREATE TABLE child2 (
c2id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
pid bigint NOT NULL REFERENCES parent (pid),
rid bigint NOT NULL,
FOREIGN KEY (rid, pid) REFERENCES ranges (rid, pid)
);
也就是说,将所有范围保留在一个表中,以便您可以定义排除约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.