当表中的值显示错误时,如何对表中的2列应用唯一键约束

时间:2010-11-10 06:56:34

标签: sql-server-2005

The CREATE UNIQUE INDEX statement terminated because a duplicate key was found 
for the object name 'dbo.tblhm' and the index name 'New_id1'. The duplicate 
key value is (45560, 44200).

我想知道如何处理将2列组合在一起的唯一键约束。这样以前存储在数据库中的值不是那种格式。这样就显示了上面的错误,那么如何克服这一点,以便所有工作都可以完成,数据库中的列值不会被删除

3 个答案:

答案 0 :(得分:0)

如果我正确地关注了您,您有一个重复的键,您想要忽略但仍希望在未来应用唯一约束?我不认为这是可能的。您需要删除重复的行(或更新它以使其不重复),将复制的数据移动到没有唯一索引的存档表中,或者将索引添加到现有表中而没有唯一约束。

我有待纠正,但我不认为还有其他办法。

答案 1 :(得分:0)

让我们假设您要在列column1

中创建列的唯一索引:column2dbo.tblhm

这将假设表column1, column2

中的任何行中没有dbo.tblhm值的任何组合的重复。

根据您的错误,(45560, 44200)的{​​{1}}值的以下组合column1, column2出现在1行以上,因此约束失败。

您需要做的是首先使用UPDATE语句清理数据,以便在尝试创建约束之前更改重复行中的column1 or column2值。

AFAIK,在Oracle中,您有“novalidate”关键字,可用于在不清理现有数据的情况下实现您的目标。但至少我没有意识到在没有先清理数据的情况下在SQL Server中实现这一目标

答案 2 :(得分:0)

错误意味着它所说的内容 - 有多个行具有相同的密钥。

即。对

CREATE UNIQUE INDEX New_id1 on dbo.tblhm(Column1, Column2)

对于Column1和Column2

,有多个行具有相同的值

所以要么

  • 您的数据已损坏(例如在不检查重复项的情况下插入) - 您需要在重新创建索引之前查找并合并/删除重复的密钥
  • 或者您的索引不能是唯一的(例如,有一个有效的理由可以说明此密钥可以有多行,例如在业务级别)。