【问题标题】:Insert records from one table to another without violating any constraint in SQL Server database在不违反 SQL Server 数据库中的任何约束的情况下将记录从一个表插入到另一个表
【发布时间】:2015-08-25 03:27:11
【问题描述】:

SQL Server 2008 中有 2 个数据库 DB_MainDB_Backup

我想将Table1的数据从DB_Backup复制到DB_MainTable1

两个数据库中所有表的结构都是一样的。两个数据库中的两个表都有外键、主键约束。

当我尝试使用此查询将Table1 的数据从DB_Backup 复制到DB_MainTable1 中时:

Insert into [DB_Main].[Table1] 
    Select * 
    from [DB_Backup].[Table1]; 

我收到这个外键错误。

INSERT 语句与 FOREIGN KEY 约束冲突 “FK_Table1_Table3”。数据库“DB_Main”中发生冲突, 表“Table3”,列“RequestID”。

请告诉我有什么简单的方法可以将Table1的所有记录从DB_Backup复制到DB_MainTable1而不违反任何约束?

请回复

【问题讨论】:

  • Please tag the database type (SQL Server?) 这个错误意味着您还需要将数据加载到Table3Table1 的列中有一条数据需要首先存在于Table3 中。查看外键并找出需要数据的列。
  • @Nick.McDermaid:谢谢您的回复。 Table3 里面已经有数据了。只是由于某种原因Table1 从 DB_Main 数据库中删除了所有数据,所以我从 DB_Backup 数据库中插入备份数据。请让我知道我应该在查询中更改什么?
  • 你检查约束了吗?你读过外键约束吗?我建议您在不了解外键约束的情况下不要进行数据修补练习。无论如何,我无法告诉您要更改什么,因为您尚未发布约束定义。我们需要知道约束附加到Table1 中的哪一列。
  • @Nick.McDermaid:我请求您再次查看我发布的问题中的错误。我提到了列名RequestID 这个列是Table1 中的外键和Table3 的主键。请注意,我是数据库的新手。请让我知道您需要与该错误相关的其他信息,我会让您知道。请回复
  • 这意味着,例如,您试图将一条记录插入到 Table1 中,其中 RequestID = 75。外键约束意味着 必须 RequestID = 75 in Table3.... 的记录,目前没有。所以这意味着您还需要将数据加载到Table3。这有意义吗?

标签: sql-server


【解决方案1】:

这意味着,例如,您试图将一条记录插入到 Table1 中,例如 RequestID = 75。外键约束意味着Table3....中必须有RequestID = 75的记录,目前没有。

所以这意味着你还需要将数据加载到Table3

查找实际导致问题运行的记录

Select DISTINCT RequestID from [DB_Backup].[Table1]

其中一些请求 ID 需要 Table3 中的“父”记录

要找到特定的运行

Select RequestID from [DB_Main].[Table3] 
WHERE Request_ID NOT IN (
    Select DISTINCT RequestID from [DB_Backup].[Table1]
    )

您需要将这些插入到Table3:

insert into Table3(Request_ID, OtherColumn)

Select RequestID, OtherColumn from [DB_Backup].[Table3] 
WHERE Request_ID NOT IN (
    Select DISTINCT RequestID from [DB_Main].[Table3]
    )

然后您可以加载其他记录。

【讨论】:

    【解决方案2】:

    在插入之前删除或禁用约束 FK_Table1_Table3 并在其之后启用。

    禁用:

    ALTER TABLE Table1 NOCHECK CONSTRAINT ALL
    

    ALTER TABLE Table1 NOCHECK CONSTRAINT FK_Table1_Table3
    

    Source

    启用

    ALTER TABLE Table1 CHECK CONSTRAINT ALL
    

    ALTER TABLE Table1 CHECK CONSTRAINT FK_Table1_Table3
    

    【讨论】:

    • 并违反数据库完整性?
    • 感谢您的回复。请告诉我该怎么做?
    • @Nick.McDermaid 是的。这种方式用于在短时间内加载大量数据。当然,在加载解决一致性问题之前,您应该自己检查完整性。
    • @ViktorBardakov:感谢您的回复。我只是想确认这样做不会损害数据库中的任何数据或表结构??因为 DB_Main 是我用于我的应用程序的实时数据库。请回复
    • 是的,它会损害数据。你有一个外键问题,你不能通过关闭外键来解决这个问题。这就像如果你看到一个小偷,你只需关闭防盗警报。你通过修复数据来修复它。
    猜你喜欢
    • 2016-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多