- 情况一
表上某一列上创建有聚集索引,但是该列不是主键列。举例如下:
CREATE TABLE TEST_C (A INT, B VARCHAR, |
或:
CREATE TABLE TEST_C1(A INT,B VARCHAR); |
这种情况下,在列 A 上有一个聚集索引,如下图所示:

此时若想直接修改列 A 的字段类型或删除列 A,会报错:不能修改或删除聚集索引的列。
若想对列 A 进行修改,需要先删除掉 A 上的索引,再做修改。

- 情况二
表上某一列为聚集主键,举例如下:
CREATE TABLE TEST_PK(A INT PRIMARY KEY,B VARCHAR); |

此时修改或删除列 A,会报错:不能修改或删除聚集索引的列;删除表上的主键约束会报错:试图删除聚集主键。
在这种情况下,若想对列 A 进行修改,可以重建表,或者重新在别的列上建立一个聚集索引,然后再删掉,此时主键上的索引变成非聚集了,就可以修改了。
要想在一开始建表的时候就指定非聚集主键,有两种方法:
用语句显式指定;
修改 dm.ini 参数 PK_WITH_CLUSTER 为 0,默认创建主键时为非聚集型;
语句显式指定如下:
CREATE TABLE TEST_PK2(A INT,B VARCHAR, |

此时可以对列 A 进行修改与删除,如下图所示:


- 修改 dm.ini 参数的方式
由于 PK_WITH_CLUSTER 默认取值为 1,即仅指定 PRIMARY KEY 关键字时默认创建为聚集主键,修改为 0 后默认创建非聚集主键。如下所示:
SELECT * FROM V$DM_INI WHERE PARA_NAME = 'PK_WITH_CLUSTER'; |
查询该参数的值可以使用 SP_SET_PARA_VALUE(1,'PK_WITH_CLUSTER',0) 语句来将该参数值修改为 0;使用 SP_SET_PARA_VALUE(1,'PK_WITH_CLUSTER',1) 语句将该参数值改回 1。
另外,报错表 xx 中不能同时包含聚集 KEY 和大字段也可以通过将表重建为非聚集型主键的方式来解决。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




