考虑两个相关的表,T1和T2,其中T2.T1_ID值指的是T1.ID值。我正在寻找如何使用约束、唯一索引、巧妙的插入/选择或其他方法来防止最终出现与相同T2.NAMES列表相关联的重复T1.NAME。
表T1
ID NAME
1 'fred'
表T2
T1_ID NAME
1 'joe'
1 'jane'
因此,"fred"与"joe"one_answers"jane"联系在一起。我想防止插入T1和T2,这样我会得到多个具有相同关联T2名称的T1名称。
也就是说,我希望做以下插入的整体尝试失败:
INSERT INTO T1 (ID, NAME) VALUES (3, 'fred');
INSERT INTO T2 (T1_ID, NAME) VALUES (3, 'joe');
INSERT INTO T2 (T1_ID, NAME) VALUES (3, 'jane');
因为这将导致以下(无效(表内容:
表T1
ID NAME
1 'fred'
3 'fred'
表T2
T1_ID NAME
1 'joe'
1 'jane'
3 'joe'
3 'jane'
也就是说,"fred"将与列表"joe"one_answers"jane"关联两次。
请注意,如果存在与同一T1名称相关联的T2名称的不同列表,则ok。也就是说,应该允许以下情况:
INSERT INTO T1 (ID, NAME) VALUES (3, 'fred');
INSERT INTO T2 (T1_ID, NAME) VALUES (3, 'joe');
INSERT INTO T2 (T1_ID, NAME) VALUES (3, 'jane');
INSERT INTO T2 (T1_ID, NAME) VALUES (3, 'kimberly');
因为这将导致以下(有效(表内容:
表T1
ID NAME
1 'fred'
3 'fred'
表T2
T1_ID NAME
1 'joe'
1 'jane'
3 'joe'
3 'jane'
3 'kimberly'
以下也可以:
INSERT INTO T1 (ID, NAME) VALUES (3, 'fred');
INSERT INTO T2 (T1_ID, NAME) VALUES (3, 'joe');
因为这将导致以下(有效(表内容:
表T1
ID NAME
1 'fred'
3 'fred'
表T2
T1_ID NAME
1 'joe'
1 'jane'
3 'joe'
您应该重新触发您的设计
首先有一个名称表
用户表
ID NAME
1 'fred'
2 'jane'
3 'joe'
4 'kimberly'
她的eon ID是promary KEY,NAE被禁止唯一约束
和第二表关系
FK_ID1 FK_ID2
1 2
1 3
2 4
她你有一个优先密钥(FK_ID1,FK_ID2(
这将强制fred只能与jane交一次朋友,因为添加另一行将违反主键约束
根据我的评论:
如果你想知道弗雷德是否和简有同样的朋友。计数将为0
SELECt Count(*)
FROM (SELECT FK_ID2 FROM relationships WHERE FK_ID1 = 1) f1
LEFT JOIN (SELECT FK_ID2 FROM relationships WHERE FK_ID1 = 2) f2 ON f1.FK_ID2 = f2. FK_ID2
WHERE f2. FK_ID2 is NULL
定义两个实体之间关系的桥接表可以包含额外的列,但也应该记住规范化。