【问题标题】:How to copy data from one table to another when foreign key is only defined in the destination table?仅在目标表中定义外键时,如何将数据从一个表复制到另一个表?
【发布时间】:2020-03-27 08:45:16
【问题描述】:

Table_A 架构:

Id (PK, int)
Name (nvarchar(40))
UserId (**FK**, int)
Date (datetime)*

Table_B 架构:

Id (PK, int)
Name (nvarchar(40))
UserId (int)
Date (datetime)

UserId 列在Table_A 中定义为外键。
我需要将数据从Table_B 复制到Table_A,我使用了:

SET IDENTITY_INSERT Table_A ON

INSERT INTO Table_A ([Id], [Name], [UserId], [Date])
    SELECT [Id], [Name], [UserId], [Date] 
    FROM Table_B

但我明白了:

INSERT 语句与 FOREIGN KEY 约束“FK_UserId”冲突
冲突发生在数据库“Table_A”、表“dbo.Users”、列“Id”中。

Users当然存在。

仅供参考
这种情况是由于SO Demo Db没有FK信息这一不幸的事实。
related question

【问题讨论】:

  • 你不能。这就是关系数据库实施关系完整性的方式。您可以删除 FK 或仅选择不违反 FK 的行或使用缺失数据填充外部表。
  • 级联选项可能会有所帮助。

标签: sql sql-server insert foreign-keys schema


【解决方案1】:

当目标表中创建了外键约束时,无法将数据从源表复制到目标表。

【讨论】:

  • 如果是这种情况,那么您将永远无法将数据输入到任何定义了 FK 的表中。这实际上会使您的数据库无用。
  • 我们不能说 DB 在这里没用。我们需要更多地了解场景以获得正确的解决方案。我们可以编写存储过程,根据某种逻辑将记录从一个表复制到另一个表。
【解决方案2】:

如果您真的需要获取这些记录,您可以加入 users 表以确保您拥有有效的用户 ID:

INSERT INTO Table_A ([Id], [Name], [UserId], [Date])
    SELECT EData.[Id], [Name], EData.[UserId], [Date] 
    FROM Table_B EData
INNER JOIN Users FKData on FKData.UserID = EData.UserID

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多