这是我的设计
我想要一个只能(最多)确保
结果的约束select ID
from A a, B b
where a.ID = b.PartialKey_Ref_A
and a.PartCandidateB = 'valueA'
and b.PartialKeyB = 'valueB'
顺便说一句(也许改变了最佳设计)我最多想要一个
的结果select ID
from A
where PartCandidateA = 'valueA2'
and PartCandidateB = 'valueB2'
如何强制执行约束并优化设计?
答案 0 :(得分:3)
我认为你写Key
的地方是指唯一或主要密钥。而ID
表示代理(自动生成)标识符。根据这些假设,这两个表格处于1:n
关系,您可以将它们更改为:
Table A
-------
PartCandidateA
PartCandidateB
ID
PRIMARY KEY (ID)
UNIQUE KEY (PartCandidateA, PartCandidateB) --- or PRIMARY if you drop the ID
--- this is your second constraint
Table B
-------
PartCandidateA
PartCandidateB
PartialKeyB
PRIMARY KEY (PartCandidateB, PartialKeyB) --- or UNIQUE
--- this is your first constraint
FOREIGN KEY (PartCandidateA, PartCandidateB)
REFERENCES A (PartCandidateA, PartCandidateB)
因此,查找ID
的查询将写为:
SELECT ID
FROM A a, B b
WHERE a.PartCandidateA = b.PartCandidateA
AND a.PartCandidateB = b.PartCandidateB
AND b.PartCandidateB = 'valueA'
AND b.PartialKeyB = 'valueB'
答案 1 :(得分:0)
我想我需要将PartCandidateB列添加到表B. 然后我可以在(PartialKeyB,PartCandidateB)上添加唯一约束。 这将增加TableB中sizeof(PartCandidateB)*行的DB。 但约束将被强制执行:)
我不认为这会引入除了尺寸增加之外的任何问题
感谢所有人
答案 2 :(得分:-1)
您可以通过在这两列上创建唯一索引来简单地在这两列上创建唯一约束:
create unique index ind1 on tablea(PartCandidateA, PartCandidateB);