Sql 唯一非聚集索引出错
我试图将一个字段移动到表中不同的位置(我只是想按字母顺序获得它)。单击“保存”时,会收到此错误消息(TaskID是另一个字段的名称):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 为什
“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