[英]Unique constraint over multiple tables
假设我们有这些表:
CREATE TABLE A (
id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE B (
id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE Parent (
id SERIAL NOT NULL PRIMARY KEY,
aId INTEGER NOT NULL REFERENCES A (id),
bId INTEGER NOT NULL REFERENCES B (id),
UNIQUE(aId, bId)
);
CREATE TABLE Child (
parentId INTEGER NOT NULL REFERENCES Parent (id),
createdOn TIMESTAMP NOT NULL
);
是否可以在Child
上创建一个唯一约束,以便对于Child
中的所有行至多引用一个具有某些aId
值的Parent
? 换句话说,我可以创建一个唯一约束,以便上述表的连接不会有重复aId
吗? 我不认为——我能找到的每个数据库的语法似乎都与每个约束绑定到一个表——但这可能是我缺乏想象力。 (当然,去规范化以在Child
上包含aId
是一种解决方案。)
您可以尝试以下方法。 您必须在 Parent 中的(id, aId)
上创建一个冗余的 UNIQUE 约束(SQL 非常愚蠢,不是吗?)。
CREATE TABLE Child
(parentId INTEGER NOT NULL,
aId INTEGER NOT NULL UNIQUE,
FOREIGN KEY (parentId,aId) REFERENCES Parent (id,aId),
createdOn TIMESTAMP NOT NULL);
可能更好的解决方案是从 Child 表中完全删除 parentId,添加bId
并仅基于(aId, bId)
引用 Parent 表:
CREATE TABLE Child
(aId INTEGER NOT NULL UNIQUE,
bId INTEGER NOT NULL,
FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),
createdOn TIMESTAMP NOT NULL);
你有什么理由不能这样做吗?
执行此操作的正确方法是完全取消Child
表并将createdOn
列放在Parent
表中,而不使用NOT NULL
约束。 您所说的只是一个Parent
条目可以有零个或一个(但不是更多) createdOn
值。 你不需要一个单独的表。 这样做并不容易或不明显这一事实部分地证明了我的观点。 ;-) SQL 通常会这样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.