【问题标题】:Insert Statement to insert Data from one table to another插入语句将数据从一个表插入到另一个表
【发布时间】:2016-04-30 23:00:53
【问题描述】:

我有以下 SQL 代码通过比较两个表中的数据来将数据从一个表插入另一个表。目标表中的 PK 为 [bomItem], [bomRev], [bomEntry]

如果ItemID in source table = bomItem field in Dest. table AND [rev](field in Source tbl)NOT=[bomRev](in destination tbl),我想插入。

当我尝试运行脚本时,出现以下错误

消息 547,级别 16,状态 0,第 46 行 INSERT 语句与 FOREIGN KEY 约束“FK_MIBOMD_MIBOMH”冲突。冲突发生在数据库“MITESTCO”、表“dbo.MIBOMH”中。 声明已终止。

    USE [MITESTCO];
    GO

   INSERT INTO [MIBOMD] 
    ([bomItem], [bomRev], [bomEntry], [partId], [qty],[lead])
 SELECT [ItemID], [rev], [bomEntry], [partid], [qty],[lead]
 FROM [assy] 
 WHERE  [rev] IN (SELECT [bomRev] FROM [MIBOMH])
        AND [ItemID] IN (SELECT [bomItem] FROM [MIBOMH])
        AND [ItemID] IN (SELECT [ItemID] FROM [MIITEM])
        AND [partid] IN (SELECT [ItemID] FROM [MIITEM]);

【问题讨论】:

  • 错误与查询无关,而是与数据库表的设计结构有关。正如错误所说,违反了外键约束,其名称可能涉及附加表dbo.MIBOMDdbo.MIBOMH。也许您在这两个(父/子)之间有一对多的表关系,并且在子中附加记录,使连接的父 ID 为 NULL。
  • @Parfait 谢谢!是的,我有一对多的关系,并且我在父级和子级中有相同的数据/记录,唯一的 d/c 是 rev 字段。父表中的主键是bomRevbomItem。我该如何解决你所说的 Apeending 但我不知道这是如何工作的你能解释一下吗?
  • 您可以考虑暂时关闭约束,插入并重新打开。
  • @freakyhat 谢谢 我怎样才能把它加回约束?

标签: sql sql-server sql-server-2008 sql-insert


【解决方案1】:

禁用数据库中的所有约束 -

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- Insert data

重新打开它们 -

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2013-04-25
    • 2015-10-08
    • 2014-10-15
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多