Sql 唯一非聚集索引出错

Sql 唯一非聚集索引出错,sql,sql-server-2008,indexing,Sql,Sql Server 2008,Indexing,我试图将一个字段移动到表中不同的位置(我只是想按字母顺序获得它)。单击“保存”时,会收到此错误消息(TaskID是另一个字段的名称): “tblTask”表 -无法创建索引“idx\u TaskID\u notnull”。 CREATE UNIQUE INDEX语句终止,因为为对象名“dbo.tblTask”和索引名“idx\u TaskID\u notnull”找到了重复的键。重复的键值为()。 声明已终止。 我有一个TaskID的唯一非聚集索引,该索引的筛选器TaskID不为NULL 为什

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

“tblTask”表
-无法创建索引“idx\u TaskID\u notnull”。
CREATE UNIQUE INDEX语句终止,因为为对象名“dbo.tblTask”和索引名“idx\u TaskID\u notnull”找到了重复的键。重复的键值为()。
声明已终止。
我有一个TaskID的唯一非聚集索引,该索引的筛选器
TaskID不为NULL


为什么会出现此错误?

在唯一索引中,任何值中只允许有一个,包括
NULL
,因此如果有多行包含
NULL
值,则会出现此错误

我想,因为你说的是“全新领域”,所以你刚刚创建了这个专栏。如果在不填充的情况下执行此操作,则所有值都将为
NULL

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

  • 为列填充适当的值,如果不知道要开始的值,则至少填充默认值

  • 更改列,使其不为空

    alter table dbo.tbltask alter column taskid int not null

  • 向列添加默认约束,使其始终具有值

    alter table tbltask add constraint df_taskid默认值(0)用于taskid

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


    我已经过滤了索引中的非空值,所以它应该允许空值,对吗?另外,我尝试允许为空的新字段与错误消息中的字段完全不同。新字段不包含在任何索引中,我已经用数据填充了它,并将其默认值设置为非空值,我认为这并不重要,因为错误只提到TaskID字段。。。我必须能够在TaskID中允许空值,同时防止重复的非空值。@Mike您能提供问题中索引的定义吗?这可能有助于解决分歧。您的错误是在命名索引的键中有一个重复的值;最好看看索引中的键都是什么。我应该去哪里找到定义?SQL Server Management Studio似乎对我隐藏了所有SQL,除了在视图中。。。尽管我可以告诉你,TaskID是唯一一个索引键列,没有包含任何列。过滤器是
    ([TaskID]不是空的)
    @Mike这是一个问题;您可能没有权限。您可以运行此查询进行确认:
    SELECT TableName=t.name,IndexName=ind.name,IndexId=ind.index\u id,ColumnId=ic.index\u column\u id,ColumnName=col.name,ind.*,ic.*,col.*从sys.indexind内部连接sys.index\u columns ic ON ind.object\u id=ic.object\u id和ind.index\u id=ic.index\u id内部连接sys.columns columns columns ON ic.object\u id=col.ind\u id=t.object\u id,其中ind.name='name
    用于完整性,上面的问题来自这里:
    '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.
    
    create unique nonclustered index idx_TaskID_notnull on dbo.tbltask (taskid) 
        where taskid is not null