SQL了解表唯一约束

时间:2012-10-15 23:37:34

标签: sql sql-server tsql

我花了一天时间试图调试一个问题,我现在看到问题一直存在。我的表上有一个唯一的约束,它只强制将唯一值作为目录号。然而,我似乎并没有很好地理解在这种情况下什么构成独特。我有两个产品编号 MP1156 MP1156ZF

Insert into IDWProductCodes( PRCEAN, PRCGTIN, PRCatalogNumber, PRCIsActive, PRIsReplaced, PrIsREPlacement,PRProductID)
   Select 
      '11232', '23223', 'MP115BP', 1, 0, 0, '267F104C-6BA4-4C7E-A0C1-6615CBB9DA4C'

Insert into IDWProductCodes( PRCEAN, PRCGTIN, PRCatalogNumber, PRCIsActive, PRIsReplaced, PrIsREPlacement,PRProductID)
   Select 
      '11232', '23223', 'MP115', 1, 0, 1, '267F104C-6BA4-4C7E-A0C1-6615CBB9DA4C'

Insert into IDWProductCodes( PRCEAN, PRCGTIN, PRCatalogNumber, PRCIsActive, PRIsReplaced, PrIsREPlacement,PRProductID)
   Select
      '11232', '23223', 'MP15', 1, 1, 1, '267F104C-6BA4-4C7E-A0C1-6615CBB9DA4C'

我收到错误:

  

Ms 2627,Level 14,State 1,Line 5
  违反UNIQUE KEY约束' UK_CNUMUNIQUE'。无法在对象中插入重复键   ' dbo.IDWProductCodes&#39 ;.重复键值为(MP115)。

每次插入第一个键然后尝试插入第二个键时,发生了什么事情,SQL假定它们是相同的,并用第二个键覆盖第一个键,这是我根本不想要的效果。

我真正想要的是能够在表格中输入不同的字符串(无重复字符串)。我曾经想过一个独特的约束,但现在我不确定。请问解决这个问题的更好或最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

我认为你误解了正在发生的事情。如果尝试插入重复项,则SQL Unique约束不会导致覆盖现有行。违反约束的第二个插入将失败。

请显示您用于插入和表结构的代码。在我看到之后,我将修改这个答案以解决真正的问题,但是根据您提供的信息,唯一的约束不是问题。

另外,请确保该表上没有TRIGGER。这是我能想到的唯一能够创建如插入替换现有行的不稳定行为的东西。

答案 1 :(得分:0)

还有其他事情正在发生。 SQL Server不会将两个字符串'MP115'和'MP115BP'混淆为相同的值。您已多次被要求编写表格结构的脚本,以便我们可以看到它。您这样做是使用SSMS,右键单击表格, 脚本表格为>创建到>剪贴板 即可。如果您发布结果,我们可能会提供更多帮助。

然而,这是一个疯狂的猜测。您是否有可能在表中有一个计算机列,它将PRCatalogNumber截断为5个字符,并且它本身具有不同的UNIQUE INDEX?那会导致你看到的问题。