我怎么违反这个限制?

时间:2011-09-07 15:45:48

标签: sql sql-server database tsql sql-server-2000

我在表中有这个约束:

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'。

请帮助我理解为什么我不能进行这些插入?我对这些复杂的约束没有经验。这是什么意思(简单来说),我该如何解决它?我实际上违反了约束吗?

4 个答案:

答案 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]