问题描述:无法重新创建索引 'PK_ProductInfos'(约束名称 )新的索引定义与现有索引强制的约束不匹配。(实在着急 直接看错误原因分析)
数据库索引: 索引分为 :1.聚集索引 2.非聚集索引
聚集约束:在创建数据表时,如果你把其中一个列设置为“主键”,在创建表成功后,SQL系统会对此表自动生成一个聚集约束【clustered】,聚集索引在表只能存在一个。
问题发生的前提: 如开头所述,此表你设置了一个主键,并且系统自动生成了一个聚集索引,但是你想自己通过 SQL脚本设置一遍。
注意:下述SQL语句
create clustered index PK_ProductInfos
on dbo.ProductInfos(Id)
with (
drop_existing = on
)
上述脚本语句注释:create index PK_ProductInfos on dbo.ProductInfos(Id) [ 创建索引最简洁语法格式 ]
clustered(聚集索引),dbo.ProductInfos(Id) 根据那个列创建索引(ID)为依赖列。
with(
drop_existing = on / drop_existing = off /* --drop_existing:表示如果这个索引还在表上就 drop 掉然后在 create 一个新的通常是off
--drop_existing=on:指定要删除并重新生成现有索引,如果指定的索引名称已经存在,可以继续执行成功。
--drop_existing=off:指定不删除和重新生成现有的索引。 如果指定的索引名称已经存在,SQL Server 将显示一个错误。
*/
)
执行结果:(系统报错)
错误原因分析:
明明是按照标准语法格式执行为什么会发生错误,我们去认真思考一下,我们在给那个列做索引,这个列的特定是什么。
好了,我来给大家统一回复,上述图\脚本中 我们依赖 [id] 新建索引,ID列是我们这个表的主键,是主键约束,具有唯一性,错误提示:“新的索引定义与现有索引强制的约束不匹配”,我们在重新构建索引时只是说明了 聚集索引,并没体现出它的唯一性。 因此我们在书写创建聚集索引的代码时,在 create xx clustered,在“xx”这里替换成“unique”,以体现当前表上主键[id]存在的唯一性,我们在重新运行脚本时就不会出错了。
运营结果如下:
总结:这次问题非常晦涩隐蔽,不仅是SQLserver会出现这类问题,其他数据也会有此类问题,根据错误提示 “强制约束”我们能理解一二,此次问题涉及内容过多,时间有限,只能简单就问题做一解释,后期我还会发布涉及, SQL数据库分区、聚集索引和非聚集索引的区别、详细给大家做一说明。欲知后事如何,请看下集。