【问题标题】:Error on a unique non-clustered index唯一非聚集索引上的错误
【发布时间】:2016-01-28 18:38:58
【问题描述】:

我正在尝试将字段移动到表格中的不同位置(我只是想按字母顺序获取它)。单击保存时,我收到此错误消息(TaskID 是另一个字段的名称):

'tblTask' table
- Unable to create index 'idx_TaskID_notnull'.  
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.tblTask' and the index name 'idx_TaskID_notnull'. The duplicate key value is (<NULL>).
The statement has been terminated.

我有一个具有过滤器 TaskID IS NOT NULL 的 TaskID 的唯一非聚集索引。

为什么会出现这个错误?

【问题讨论】:

    标签: sql sql-server-2008 indexing


    【解决方案1】:

    您只能在唯一索引中使用任何值之一,包括 NULL,因此如果您有多行包含 NULL 值,这就是您会收到错误的原因。

    我想,因为您说“全新领域”是您刚刚创建了该列。如果您在没有填充它的情况下这样做,则所有值都是NULL

    解决这个问题的最简单方法是:

    1. 为列填充适当的值,或者至少填充任何您希望的默认值(如果您不知道要开始的适当值)。

    2. ALTER您的列,使其不为空

      alter table dbo.tbltask alter column taskid int not null

    3. 为您的列添加默认约束,使其始终具有值。

      alter table tbltask add constraint df_taskid default (0) for taskid

    或者,如果您希望表中的所有旧行都为 NULL,并且只有新行始终为 NOT NULL,您可以添加过滤索引,因为您使用的是 2008(或更高版本)。

    create unique nonclustered index idx_TaskID_notnull on dbo.tbltask (taskid) 
        where taskid is not null
    

    【讨论】:

    • 我已经过滤了非空值的索引,所以它应该允许空值,对吧?此外,我试图允许 NULL 的新字段与错误消息中的字段完全不同。新字段不包含在任何索引中,我已经用数据填充它并将其默认值设置为非空值,我认为这并不重要,因为错误只提到了 TaskID 字段......我必须能够允许在 TaskID 中使用 NULL 值,同时防止重复的非 NULL 值。
    • @Mike 您能否在问题中为您的索引idx_TaskID_notnull 提供定义?这可能有助于解决差异。您的错误是说您在命名索引的键中有重复值;看看索引中的所有键都是很好的。
    • 在哪里可以找到定义? SQL Server Management Studio 似乎对我隐藏了所有 SQL,除了在视图中......虽然我可以告诉你 TaskID 是那里唯一没有包含列的索引键列。过滤器是([TaskID] IS NOT NULL)
    • @Mike 这是一个问题;你可能没有权限。您可以运行此查询来确认:SELECT TableName = t.name, IndexName = ind.name, IndexId = ind.index_id, ColumnId = ic.index_column_id, ColumnName = col.name, ind.*, ic.*, col.* FROM sys.indexes ind INNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN sys.tables t ON ind.object_id = t.object_id WHERE ind.name = 'name
    • 为了完整起见,上面的查询来自这里:stackoverflow.com/questions/765867/…
    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2010-10-23
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多