Sql server 如何在两个表上强制执行检查

Sql server 如何在两个表上强制执行检查,sql-server,Sql Server,我想知道对表2的ItemId执行检查的最佳方法是什么。检查的重点是强制表3中的行(表2链接到的行)具有与示例中相同的ItemId 编辑:在路德的评论之后,我意识到我可能需要添加更多的细节,因为目前的状态有点过于笼统 表2是一个链接表,其中表4和ItemTable合并在一起,该表也链接到表3,但这是可以为空的。表2中的PK是T4ID和ItemId的组合 关系: ItemTable to Table2是一(ItemTable)对多(Table2) 表3中的ItemTable是一对多(表3) 表2至表

我想知道对表2的ItemId执行检查的最佳方法是什么。检查的重点是强制表3中的行(表2链接到的行)具有与示例中相同的ItemId

编辑:在路德的评论之后,我意识到我可能需要添加更多的细节,因为目前的状态有点过于笼统

表2是一个链接表,其中表4和ItemTable合并在一起,该表也链接到表3,但这是可以为空的。表2中的PK是T4ID和ItemId的组合

关系:

ItemTable to Table2是一(ItemTable)对多(Table2)

表3中的ItemTable是一对多(表3)

表2至表3是一对多(表2)

表2至表4为一(表4)对多(表2)

ItemTable表2表3表4
项目ID(主键)T4ID(主键FK)T3ID(主键)T4ID(主键)
ItemId(主键FK)ItemId(FK)
T3ID(FK)

您可以通过在
表3
上声明一个“超级键”来强制执行此操作,该“超级键”包括
T3ID
ItemID
(通常,这将是唯一的键约束/索引)

然后,您还可以在
T3ID
ItemID
上的表2和表3之间声明额外的1 FK

即,保持所有现有约束不变。然后运行:

ALTER TABLE Table3 ADD CONSTRAINT UQ_Table3_Items UNIQUE (T3ID, ItemId);
ALTER TABLE Table2 ADD CONSTRAINT FK_Table2_ItemXRef
   FOREIGN KEY (T3ID, ItemId) references Table3 (T3ID, ItemID);


1从技术上讲,这使得基于
T3ID
的普通FK变得多余,但我通常更愿意将其保留在当前位置,以表示“真实”外键。

这是一个很好的问题,您能再解释一下吗?ItemTable和Table2之间的关系是什么,一对一还是一对多?同样,表2和表3之间的关系是什么?考虑规范数据库和消除<代码>表2。这是多余的,因为表3中应该有相同的值。假设您为数据库中的每个PK和每个FK编制了索引,那么连接表应该是高效的;您可以从表3中检索ItemId。@RuudHelderman-但是如果您需要,例如,在
Table2
中有一个检查约束,它取决于
ItemId
的值,这有时是必要的/可取的。我编辑了我的文章以提供更多的信息,您的解决方案在这种情况下仍然有效吗?太好了!我认为itemtable和table4首先在循环中填充,然后从itemtable填充table3。然后从table3和table4填充table2。这是正确的循环吗?如果表3中的T3ID+itemid定义为复合PK,其中T3ID可以是identity int,那么这个复合PK可以作为FK引用到表2中,因此问题得到解决。请回答我的两个问题。几乎表2是从item和表4填充的,表3是可选的(可为空),其余的是正确的。正如我在回答中指出的,我们不需要更改表3中的PK-我们只需声明一个包含当前PK和
ItemID
列的超级键作为附加列,并将其用于表2中的附加/替换FK。
ALTER TABLE Table3 ADD CONSTRAINT UQ_Table3_Items UNIQUE (T3ID, ItemId);
ALTER TABLE Table2 ADD CONSTRAINT FK_Table2_ItemXRef
   FOREIGN KEY (T3ID, ItemId) references Table3 (T3ID, ItemID);