Sql 我是如何违反这个约束的?
我在表中有此约束:Sql 我是如何违反这个约束的?,sql,sql-server,database,tsql,sql-server-2000,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] [
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,14级,状态2,第34行违反唯一密钥
约束“IX_InventoryLocations_1”。无法在中插入重复的密钥
对象“InventoryLocations”
请帮助我理解为什么我不能进行这些插入?我对这些复杂的约束没有经验。这是什么意思(简单地说)以及我如何避开它?我真的违反了约束吗?在不知道要插入的列的名称的情况下,仅通过约束中列出的列的数量(9)看起来每一行在表
InventoryLocations
中都必须是唯一的。您正在插入(10)列。基于要添加的数据,您的约束定义错误
编辑:编辑表定义后,唯一约束
中列出的列仍然过多,这导致了插入
失败。如果列出要插入的列名,这将非常有帮助
编辑:将硬编码值插入约束中列出的列中。因为它们总是相同的,所以违反了约束,您会看到您发布的错误。您需要改变进入表中的数据,或者通过删除一些列来放松约束。您必须让我们知道插入的
的第一部分,而不仅仅是值。但是,很容易看出发生的情况,基本上是您试图插入一条违反[IX\u InventoryLocations\u 1]
的记录,该记录指出表中没有两条记录可以具有以下字段的相同值:
[LocItemNumber]
[WareHouse]
[Aisle]
[Slot]
[locLevel]
[Bin]
[Extra]
[RollNumber]
[SkidNumber]
表中是否已有与您试图插入的问题中的数据冲突的行
在评论和问题编辑后编辑
添加以下内容:
在循环中输入一些指纹,以查看要插入的值。我认为SQL Server不会发出错误,除非您尝试插入DUP。您的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
可能正在从FI_CurrentReceiptData
返回多行。注释掉Insert并查看结果,看看返回了多少行。或者完全从FI_CurrentReceiptData CR
中删除,因为SELECT
不使用任何内容。您可以显示表的模式,还是完全按照约束定义中所示?您还可以显示确切的INSERT
语句吗(或者它不包括列名)?请注意,约束冲突可能不是由于插入的两行中的冲突造成的,但表中可能已经存在一个或两个键组合。LocItemNumber是表的主键吗?您的values
子句现在与表结构无关。什么是真正失败的代码?@jamesjohnson-不,请参见表schema。第七和第八个也不同。那不是真的,第七和第八个也不同。我假设insert语句中的第一列实际上没有在约束中定义。原始版本显示第7和第8个字段也不同。@Adrian-好的,根据约束,哪些数据无效?我对更改一些输入数据没有问题,我只是试图满足现有的表。我不会使用所有这些字段。?如果查看编辑的历史记录,则第7个和第8个值从一开始就不同,因此您认为前9个值在INSERT
s中都相同的假设在编辑之前也不正确:-(@KM-否,插入之前的表中没有locItemNumber的'MW1'。您对问题的编辑显示表中有许多列,但您只给出了插入的一半,列列表在哪里?插入语句在游标内(如我的编辑中所述)。很可能您的SELECT
正在从FI_CurrentReceiptData
返回多行。注释掉插入内容并查看结果……或者表中已经显示了一个或多个键组合。我认为OP关注的是从光标出来的数据,而不是将其与已读取的数据进行比较“表中的y”。@Martin Smith-我在代码修订中迷失了方向。select是以前的版本,显然我需要在游标中使用实际值子句。我发布Values子句的唯一原因是发布表(即使是小表)确实很痛苦。”因此,+1,很高兴终于看到了实际的代码。如果变量是从同一个表上的游标填充的,那么可能就不应该有FROM。-这不能违反约束,因为该表已经有许多相同的记录,但约束中只有一个字段。