【发布时间】:2022-08-18 21:43:27
【问题描述】:
考虑两个相关的表,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\' 和 \'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\' 和 \'jane\' 关联两次。
请注意,这将是好的因为有一个不同的列表与相同的 T1 NAME 关联的 T2 NAME。也就是说,应该允许以下情况:
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\'
-
您可以使用开始/提交/回滚事务并在事务内部检查是否会出现这种情况并在必要时回滚。实际语法取决于您使用的 rdbms 产品。
-
谢谢,@tinazmu!这似乎很有希望。我会试一试。
标签: sql