无法在SQL Server中创建唯一索引,如何知道索引ID是指索引的索引

时间:2010-09-22 07:19:02

标签: sql-server indexing

我有一个脚本在执行时会出错:

Msg 1505, Level 16, State 1, Server CBR07I300FVA1, Line 1 CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 17. Most significant primary key is '44'. The statement has been terminated.

该脚本包含数千行查询,因此我不知道脚本中的错误来自何处。有没有办法知道“索引ID 17”代表什么?

4 个答案:

答案 0 :(得分:1)

在脚本中的每个重要步骤(例如print)之前插入create unique index语句,您就完成了。

通常这样做:

if @@error <> 0
   PRINT '@@error is ' + ltrim(str(@@error)) + '.'
else
   print 'Index IX_... successfully created' 

答案 1 :(得分:1)

你说一个有数千行的剧本,嗯?

我的建议:在中间放一个print("Test"),看看错误发生在之前或之后。然后再次在中间等等,直到找到导致你麻烦的地方。

答案 2 :(得分:0)

您正在处理的表已包含数据;并且数据在您的新索引方面并不是唯一的。

示例:

 col1 | col2 | col3
====================
 foo  | 1    | q
 bar  | 2    | w
 bar  | 3    | e
 bar  | 2    | r

在上表中,您无法在(col1,col2)上创建唯一索引,因为其中的数据将是非唯一的(多行(bar,2))。脚本无法知道实际需要哪些“重复”行。它有三种选择:

  • 创建一个带有重复行的UNIQUE索引(无效,因为它不再是唯一的)
  • 删除重复的行(不安全,如何知道需要哪些行?)
  • 什么都不做,抛出错误(最安全的选择,你在这里

您可以采取以下措施来解决此问题:

运行查询以查找重复项 - 如果按行索引使用的列对行进行分组,则某些组将具有多行。那些是你的重复;你需要以某种方式消除他们的两面性。

答案 3 :(得分:0)

如果您在SSMS中运行此脚本,只需双击该错误,它将转到导致错误的代码行...