如何强制执行与另一个表中的名称关联的唯一名称列表



考虑两个相关的表,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

定义两个实体之间关系的桥接表可以包含额外的列,但也应该记住规范化。

最新更新