Oracle 19C中如何删除数据表列的IDENTITY标识属性
Oracle 19c 移除数据表列IDENTITY标识的实现说明
官方支持的标准实现方式
Oracle 19c原生提供了移除列IDENTITY自增标识的正规语法,不需要修改任何底层系统表,操作不影响列上存量数据,是唯一推荐的方案:
- 核心操作语法如下,执行后会直接剥离目标列的自增属性,绑定在列上的隐式自增序列会被数据库自动回收清理,不会残留无效对象:
ALTER TABLE <目标表名> MODIFY <目标列名> DROP IDENTITY;
- 实际使用示例:
-- 建表示例:带IDENTITY自增列的用户表 CREATE TABLE t_user( user_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, user_name VARCHAR2(64) NOT NULL ); -- 移除user_id列的IDENTITY标识 ALTER TABLE t_user MODIFY user_id DROP IDENTITY;
- 操作验证:执行完成后查询数据字典视图
USER_TAB_COLS,对应列的IDENTITY_COLUMN字段值会从YES变为NO,即标识移除成功。该操作属于元数据级DDL,执行速度极快,仅在DDL生效瞬间持有短暂表锁,对业务影响极小,执行账号仅需要拥有目标表的ALTER权限即可。
禁止通过操作SYS系统表实现该需求
绝对不要编写脚本直接修改SYS模式下的底层系统表来实现该需求,原因如下:
- IDENTITY列的属性定义并非孤立存储在单张系统表中,而是关联了
col$、seq$、tab$等多张底层系统表的关联记录,手动修改极易漏改关联项,直接造成数据字典元数据不一致。 - 直接修改SYS系统表是Oracle官方明确禁止的非合规操作,轻则导致目标表无法正常执行DDL、查询列属性触发内部错误,重则引发数据块损坏、数据库实例异常,且此类操作导致的故障不在Oracle官方服务的支持范围内。
注意:不要采用“删除原列后重建同名列”的方式移除IDENTITY标识,该操作会直接丢失列上的存量数据,还会导致列上绑定的索引、约束、外键、触发器等关联对象失效,风险远高于使用标准语法操作。
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

