多个表的唯一约束

tro*_*ine 8 sql postgresql relational-algebra normalization denormalization

假设我们有这些表格:

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最多一个引用中的所有行,Parent具有某个值aId?换句话说,我可以创建一个唯一约束,以便上表的连接没有重复aId吗?我在想 - 我能找到的每个数据库的语法似乎都与每个约束的一个表相关联 - 但这可能是我缺乏想象力的.(DE-标准化为包括aIdChild当然是一个解决方案,.)

nvo*_*gel 7

你可以尝试以下方法。您必须在(id, aId)Parent 中创建一个冗余的 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);
Run Code Online (Sandbox Code Playgroud)

可能更好的解决方案是从子表中完全删除parentId,添加bId并仅基于以下内容引用父表(aId, bId)

CREATE TABLE Child
(aId INTEGER NOT NULL UNIQUE,
 bId INTEGER NOT NULL,
FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),
createdOn TIMESTAMP NOT NULL);
Run Code Online (Sandbox Code Playgroud)

你有什么理由不能这样做吗?