我在表中有这个约束:
CREATE TABLE [dbo].[InventoryLocations]
(
[recid] [int] IDENTITY(1,1) NOT NULL,
[LocItemNumber] [char](16) NOT NULL,
[WareHouse] [char](2) NOT NULL,
[Aisle] [char](3) NOT NULL,
[Slot] [char](3) NOT NULL,
[locLevel] [char](2) NOT NULL,
[Bin] [char](2) NOT NULL,
[Extra] [char](2) NOT NULL,
[LocNumber] [char](2) NOT NULL,
[RollNumber] [char](20) NOT NULL,
[QuickRoll] [int] NOT NULL,
[SkidNumber] [char](15) NOT NULL,
[RollsInStock] [int] NOT NULL,
[LocQtyOnHand] [float] NOT NULL,
[LocQtyOnOrder] [float] NOT NULL,
[LocQtyCommited] [float] NOT NULL,
[TotalReceived] [float] NOT NULL,
[TotalIssued] [float] NOT NULL,
[TotalDollars] [float] NOT NULL,
[Capacity] [float] NOT NULL,
[AvailableSpace] [float] NOT NULL,
[bkey0] [char](30) NULL,
[bkey1] [char](30) NULL,
[bkey2] [char](30) NULL,
[bkey3] [char](14) NULL,
[LastPhysicalCountDate] [datetime] NULL,
[LastCycleCountDate] [datetime] NULL,
[EnteredBy] [varchar](50) NULL,
[EnteredDateTime] [datetime] NULL,
CONSTRAINT [IX_InventoryLocations_1] UNIQUE NONCLUSTERED
(
[LocItemNumber] ASC,
[WareHouse] ASC,
[Aisle] ASC,
[Slot] ASC,
[locLevel] ASC,
[Bin] ASC,
[Extra] ASC,
[RollNumber] ASC,
[SkidNumber] ASC
));
当尝试插入以下行时,我收到错误消息。 在填充变量的游标内部。
INSERT INTO [AVANTISERVER\NCL_MASTER].[Avanti].[dbo].[InventoryLocations](LocItemNumber, WareHouse, Aisle, Slot, locLevel, Bin, Extra, RollNumber, LocQtyOnHand, SkidNumber)
SELECT @item, 'F', 'L', 'E', 'X', 'O', @seq, @seq, @qty, @seq
FROM FI_CurrentReceiptData CR
其中包括:
VALUES('MW1', 'F', 'L', 'E', 'X', 'O', 0, 0, 10, 0)
VALUES('MW1', 'F', 'L', 'E', 'X', 'O', 1, 1, 10, 1)
Msg 2627,Level 14,State 2,Line 34违反UNIQUE KEY 约束'IX_InventoryLocations_1'。无法插入重复键 对象'InventoryLocations'。
请帮助我理解为什么我不能进行这些插入?我对这些复杂的约束没有经验。这是什么意思(简单来说),我该如何解决它?我实际上违反了约束吗?
答案 0 :(得分:3)
表格中是否已经存在与您要插入的问题中的数据冲突的行?
评论和问题编辑后,编辑 加上这个:
在循环中放置一些打印件,以查看您要插入的值。除非您尝试插入重复,否则我认为SQL Server不会发出错误。
答案 1 :(得分:1)
SELECT
列表中的所有项目都是常量表达式。
INSERT INTO [AVANTISERVER\NCL_MASTER].[Avanti].[dbo].[InventoryLocations](LocItemNumber, WareHouse, Aisle, Slot, locLevel, Bin, Extra, RollNumber, LocQtyOnHand, SkidNumber)
SELECT @item, 'F', 'L', 'E', 'X', 'O', @seq, @seq, @qty, @seq
FROM FI_CurrentReceiptData CR
我不确定为什么你希望它在行之间有所不同,但无论如何它都不会。也许你的意思是在某处引用一列而不是一个变量。
正如您在评论中所说,这些变量正在游标中更新,大概是您的SELECT
正在返回多行FROM FI_CurrentReceiptData
。注释掉Insert并查看结果并查看返回的行数。或者只是完全删除FROM FI_CurrentReceiptData CR
,因为SELECT
不使用任何内容。
答案 2 :(得分:0)
在不知道您尝试INSERT
的列的名称的情况下,只需通过约束(9)中列出的数字列,看起来每行必须InventoryLocations中的>完全唯一。您正在插入(10)列。根据要添加的数据,您的约束定义错误。
编辑:您的表定义编辑完成后,UNIQUE CONSTRAINT
中列出的列数太多,导致INSERT
失败。如果列出了要插入的列名,那将非常有用。
编辑:您正在将硬编码值插入约束中列出的列中。由于它们将始终相同,因此违反了约束,并且您会看到发布的错误。您需要更改进入表中的数据,或者通过删除一些列来放宽约束。
答案 3 :(得分:-1)
您必须告知我们INSERT
的第一部分,而不仅仅是值。但是,很容易判断出发生了什么,基本上是你试图插入违反[IX_InventoryLocations_1]
的记录,该记录表明表中没有2条记录可以具有以下字段的相同值: / p>
[LocItemNumber]
[WareHouse]
[Aisle]
[Slot]
[locLevel]
[Bin]
[Extra]
[RollNumber]
[SkidNumber]