【问题标题】:Inserting a record into a database with looping foreign keys使用循环外键将记录插入数据库
【发布时间】:2013-06-12 13:23:06
【问题描述】:

我有这种关系:

CurrentVersionID 指向游戏的当前活动版本。

ArcadeGameVersion 中,GameID 属性指向关联的ArcadeGame 记录。

问题是,我无法插入任何一条记录:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ArcadeGame_ArcadeGameVersions". The conflict occurred in database "Scirra", table "dbo.ArcadeGameVersions", column 'ID'.

这是一个格式错误的数据结构吗?否则,克服这个问题的最佳解决方案是什么?

【问题讨论】:

    标签: sql-server foreign-keys relational-database entity-relationship


    【解决方案1】:

    如果你需要这种结构,这个结构可以工作。假设 ID 是身份字段,我相信你需要分 5 个步骤来完成:

    1. 插入一条 ArcadeGame 记录,其中 CurrentVersionId 值为空
    2. 确定刚刚添加的记录的 ID 值,使用如下语句:SELECT @arcadeGameId = SCOPE_IDENTITY()
    3. 插入 ArcadeGameVersion 记录,将 GameID 设置为上一步中确定的值
    4. 确定刚刚添加的记录的 ID 值(再次使用 SCOPE_IDENTITY())
    5. 更新 ArcadeGame 记录(其中 ID 与步骤 2 中确定的匹配)并将 CurrentVersionId 设置为上一步中确定的值。

    您将(很可能)希望在事务中执行上述操作。

    如果 ID 不是身份字段并且您提前知道值,您可以按照与上述相同的步骤进行大部分操作,但跳过 SELECT SCOPE_IDENTITY() 步骤。

    【讨论】:

      【解决方案2】:

      看起来很糟糕。我看不出你为什么需要这个循环引用。 我将只使用一个带有附加字段 CurrentVersion 和 UploadDate 的表 ArcadeGame。 例如,您可以根据需要根据 UploadDate 查询它。如果您从该数据库中解释您想要什么,答案可能会更具体。

      【讨论】:

      • 你会如何构建它?
      猜你喜欢
      • 2023-04-03
      • 2017-10-05
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多