插入外键

时间:2015-02-18 21:16:26

标签: sql sql-server database insert

我的代码需要一些帮助...我需要插入两个表

DECLARE @IDENTITY INT

INSERT INTO BestallningMatratt (MatrattID, BestallningID, Antal)
VALUES ('1', '2', '3')

SELECT @IDENTITY = @@IDENTITY FROM BestallningMatratt

INSERT INTO Bestallning (BestallningID, BestallningDatum, Totalbelopp, Levererad, KundID)
VALUES (@IDENTITY, '28-02-2014', '250', '1', '1')

运行代码时出错

  

Msg 547,Level 16,State 0,Line 2
  INSERT语句与FOREIGN KEY约束“FK_BestallningMatratt_Bestallning”冲突。冲突发生在数据库“Tomasos”,表“dbo.Bestallning”,列'BestallningID'。

     

Msg 544,Level 16,State 1,Line 4
  当IDENTITY_INSERT设置为OFF时,无法在表'Bestallning'中为标识列插入显式值。

2 个答案:

答案 0 :(得分:2)

首先,您需要确保以正确的顺序插入表格。父表始终是第一个插入的表。您的错误消息让我觉得这可能就是这种情况。我必须看到实际的表结构是积极的。

接下来在编写代码时,您应该知道表的结构并知道哪些字段是标识字段,并且永远不要尝试直接插入这些字段(除非您是具有多年经验的dba)。特别是不是来自应用程序或存储过程。 Identity_insert用于将数据从一个系统传输到另一个系统的特殊情况,不应用于其他任何系统。不要按照任何指示在您当前的知识水平上使用identity_insert。

最后,在任何情况下都不应该使用@@ identity来获取要插入另一个表的标识值。您可以从中获得不正确的结果,并且它是一个使用它的SQL反模式。如果有人在表中添加了一个触发器,那么插入到具有标识的另一个表中的是这个将是回退的表。如果你不能预测何时有人可能会这样做,那么当数据完整性如此彻底搞砸时,你很可能只会发现问题几乎无法修复。永远不要做任何使数据完整性受到威胁的问题。最好的方法是使用OUTPUT子句,第二种最好的方法是使用Scope_Identity()。 @@身份是非常危险的,如果你在任何地方使用它,它应该立即更换。

答案 1 :(得分:0)

关于以下内容......虽然下面的代码可以解决您的问题,但它并没有改变手动创建身份的做法可能会导致您的主要问题的事实数据,并且应该只在极少数情况下由经验丰富的人知道他们正在做什么以及为什么这是唯一的解决方案。


我强烈建议您不要在可以避免的地方插入标识值,而且看起来好像您的操作无序。看起来BastallningMatratt是一个依赖于Bestallning的FK的子表。 假设是这种情况(并且需要手动将身份密钥插入BestallningMatratt,以便其密钥为" 1",请尝试以下操作:

SET IDENTITY_INSERT dbo.Tomasos ON;
GO

DECLARE @IDENTITY INT

INSERT INTO Bestallning (BestallningDatum, Totalbelopp, Levererad, KundID)
VALUES ('28-02-2014', '250', '1', '1')

SELECT @IDENTITY = SCOPE_IDENTITY()

INSERT INTO BestallningMatratt (MatrattID, BestallningID, Antal)
VALUES ('1', @IDENTITY, '3')

SET IDENTITY_INSERT dbo.Tomasos OFF;
GO