Oracle 18g删除表IDENTITY列生成类型报错的解决方法
错误原因
你触发invalid ALTER TABLE option报错是因为ALTER TABLE的MODIFY子句语法写错:Oracle修改列属性时,不需要用括号把列的修改规则包裹起来,你写的语句多了一层冗余括号才导致语法校验失败。
正确移除IDENTITY属性的语法
直接执行如下语句即可,建议带上建表时的schema名避免对象定位错误:
ALTER TABLE DATA_MIGRATION.Test_alter MODIFY id DROP IDENTITY;
执行成功后,id列的自动生成属性会被完全删除,后续插入数据如果不显式传入id值,会触发空值插入错误。
切换为自定义序列生成id的配套操作
如果要改用自定义序列生成id值,按以下步骤操作即可,适配Oracle 18c版本:
- 先查询当前表中id列的最大值,自定义序列的起始值要大于这个最大值,避免主键冲突
SELECT MAX(id) FROM DATA_MIGRATION.Test_alter;
- 创建符合你业务规则的自定义序列,示例如下:
CREATE SEQUENCE DATA_MIGRATION.custom_id_seq START WITH 102 -- 替换为你查出来的MAX(id)+1即可,比如之前max是100,步长2的话下一个值是102,按你实际需求调整 INCREMENT BY 1 -- 按你需要的步长设置 NOCACHE -- 可根据性能需求改为CACHE N NOCYCLE;
- 如果希望插入时不需要显式指定id列,可以给id列设置默认值为序列的nextval,和原来IDENTITY列的使用体验一致:
ALTER TABLE DATA_MIGRATION.Test_alter MODIFY id DEFAULT DATA_MIGRATION.custom_id_seq.NEXTVAL;
注意:列默认值直接关联序列是Oracle 12c及以上版本支持的特性,你的18c环境完全兼容,不需要额外配置触发器。如果是11g及更早版本,才需要写行级触发器实现序列自动填充。
内容的提问来源于stack exchange,提问作者PKS
相关产品推荐
相关产品推荐

