【问题标题】:Maintaining a foreign key relationship when inserting into tables with autoincrementing Id's插入具有自动递增 ID 的表时保持外键关系
【发布时间】:2011-11-03 17:31:52
【问题描述】:

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

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

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

  1. 插入缺陷
  2. 获取该缺陷的 ID
  3. 插入 ID 为 2 的缺陷数据(零个或多个)。

设置 IdentityInsert 并使用我自己的 ID 插入将不起作用,因为这是由网络服务器运行的,并且可能存在并发调用(我在这里吗?)。

提前致谢。

【问题讨论】:

    标签: sql sql-server-2008 insert foreign-key-relationship identity-column


    【解决方案1】:

    基本模式是这样使用 SCOPE_IDENTITY() 从 Defect 获取新的行 ID

    BEGIN TRAN
    
    INSERT Defect ()
    VALUES (...)
    
    INSERT DefectData (DefectID, AdditionalNotes, ...)
    VALUES (SCOPE_IDENTITY(), @AdditionalNotes, ...)
    
    COMMIT TRAN
    

    【讨论】:

    • 您通常希望将新的标识值存储在局部变量 SET @NewId = SCOPE_IDENTITY() 中,以供进一步工作或处理,或将其返回给应用程序以供将来参考。
    • 谢谢。我现在试一试。如果这个结构是链式的,我会嵌套 BEGIN TRAN 吗?
    • @TheGwa:呃..不确定你的意思。那将是一个新问题或看到这个stackoverflow.com/questions/2073737/…
    • @gbn 这就像一个魅力。 + 10 忍者分给你。我之前的评论是关于将另一个表链接到 DefectData 说 DefectDataDetail,就像 Def​​ectData 链接到 Defect 一样。 SCOPE_IDENTITY() 指的是缺陷 ID 级别。您现在如何获得下一级别的 DefectData Id?
    • @TheGwa:您必须使用 OUTPUT 子句来捕获所有 ID msdn.microsoft.com/en-us/library/ms177564.aspx
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多