|
假设我们有这些表:
) s( w: d+ ^2 h: m7 A) {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我没有考虑-
% I: P5 x+ x' p+ g7 p我能找到的每个数据库的语法似乎都限制在一个表上-
2 F# v: V! ?9 p但这可能是我缺乏想象力的原因。(当然,去标准化包括在内aIdonChild是解决方案。
4 `4 V3 h/ S4 c4 c- J* \- I, h+ N4 A
# G3 l6 k% f3 I+ X 解决方案:
, P9 v9 |, x4 V 您可以尝试以下方法。(id,aId)在Parent创建冗余UNIQUE约束(SQL很傻,不是吗?!)。/ l! d! j% w! T6 r# j# y6 F# {
CREATE TABLE Child(parentId INTEGER NOT NULL,aId INTEGER NOT NULL UNIQUE,FOREIGN KEY (parentId,aId) REFERENCES Parent (id,aId),createdOn TIMESTAMP NOT NULL);可能更好的解决方案是子表中的parentId完全删除,bId改为添加,然后引用父表(aId,bId):
, T6 S& V! \) G- V- hCREATE TABLE Child(aId INTEGER NOT NULL UNIQUE,bId INTEGER NOT NULL,FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),createdOn TIMESTAMP NOT NULL);你不能这样做的原因是什么? |
|