繁体   English   中英

跨两个表的排除约束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM