Sql 在插入具有自动递增Id的表时维护外键关系

Sql 在插入具有自动递增Id的表时维护外键关系,sql,sql-server-2008,insert,foreign-key-relationship,identity-column,Sql,Sql Server 2008,Insert,Foreign Key Relationship,Identity Column,我有两个表:缺陷和缺陷数据。每个缺陷可能有也可能没有一个或多个缺陷数据。因此,DefectData有一个DefectId列作为外键 两个表中的Id都是自动递增标识 我遇到的问题是,当我想插入一个新的缺陷及其缺陷数据时,缺陷首先被插入并获得一个Id,但我不知道该Id给缺陷数据的是什么。我的解决方案是从匹配插入数据的缺陷中进行选择,以获得Id 插入缺陷 获取缺陷的Id 插入Id为2的DefectDatazero或many。 将IdentityInsert设置为on,然后使用我自己的Id插入将不起作用

我有两个表:缺陷和缺陷数据。每个缺陷可能有也可能没有一个或多个缺陷数据。因此,DefectData有一个DefectId列作为外键

两个表中的Id都是自动递增标识

我遇到的问题是,当我想插入一个新的缺陷及其缺陷数据时,缺陷首先被插入并获得一个Id,但我不知道该Id给缺陷数据的是什么。我的解决方案是从匹配插入数据的缺陷中进行选择,以获得Id

插入缺陷 获取缺陷的Id 插入Id为2的DefectDatazero或many。 将IdentityInsert设置为on,然后使用我自己的Id插入将不起作用,因为这是由Web服务器运行的,并且可能会有并发调用“我在这里吗?”


提前感谢。

基本模式是使用此模式从缺陷中获取新行ID

BEGIN TRAN

INSERT Defect ()
VALUES (...)

INSERT DefectData (DefectID, AdditionalNotes, ...)
VALUES (SCOPE_IDENTITY(), @AdditionalNotes, ...)

COMMIT TRAN

通常,您会希望将新标识值存储在局部变量中,设置@NewId=SCOPE\u identity,以便进一步工作或处理,或者将其返回到应用程序以供将来参考。谢谢。我现在就试试这个。如果这个结构被锁上了,我会把BEGIN TRAN嵌套吗?@TheGwa:er。。不知道你的意思。这将是一个新问题,或者看看这个@gbn,它像一个符咒一样工作10个忍者指向你。我之前的评论是关于让另一个表链接到DefectData,比如DefectDataDetail,就像DefectData链接到Defect一样。范围标识是指缺陷标识级别。您现在如何获取下一级别的DefectData Id?@TheGwa:您必须使用OUTPUT子句来捕获所有Id