繁体   English   中英

对多个表的唯一约束

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

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