SYS_NC00002$之类的列
参考文档https://askmaclean.com/archives/oracle-virtual-column.htmlSystem Generatedcolumn Names inDBA IND COLUMNS KB836884IMPDP Fails With ORA-14148 When Moving Tables Between 10g And 12c Instances When Optimization Is In Use KB181188RDBMS 19.30今天在讨论SYS_NC00002$之类的列。尽管知道这种列是怎么回事最后发现还是忽略了default列。但是还是有一个列的问题导致思考了很久查了很多文档然后终于明白大约怎么回事。我的疑问我的测试环境中的SYS_NC00002$列是怎么产生的我的建表语句注意 这个建表语句中有default 1我查询到的这个列注意data_type为 raw一直不太了解这个列是怎么产生的函数索引主键虚拟列都不是最后忽略了这个default 。当查询相关视图的时候函数索引不存在主键不存在虚拟列不存在。唯一可以值得怀疑的是default列 。曾经怀疑过是基于函数的索引drop索引后遗留的问题实际测试后发现不是这个问题。最后尝试drop掉这个列的时候报以下错误ORA-14148 这个列是保护的列BBtest SQL ALTER TABLE BB.T91 DROP COLUMN SYS_NC00002$; ALTER TABLE BB.T91 DROP COLUMN SYS_NC00002$ * ERROR at line 1: ORA-14148: DML and DDL operations are not directly allowed on the guard-column. BBtest SQLMOS上搜了下看到两个参考文档文档中提出The guard column is an invisible column created when adding a column with a default value in 12c. 这句话已经说明了问题原因所在The guard column is an invisible column created when adding a column with a default value in 12c. It is created only when compatible 12.0 and _add_col_optim_enabledTRUE. Its presence should be transparent to the user.看来还真是default列产生的虚拟列。关于这个在网上看到了一句话实际上是12c的新特性default not null的特性可以参考文档https://blog.csdn.net/weixin_36040020/article/details/116511339ORA-14148: DML and DDL operations are not directly allowed on the guard-column. 这个隐藏列的产生其实是因为Oracle12c的一个新特性。12c之前在向表添加带有默认值的列的时候如果不想影响生产那么需要defaultnot null这种方式只会去修改数据字典速度很快否则会实际的物理更新每一行速度很慢影响生产业务。12c以后添加default值的列不加not null也很快这背后的实现技术是通过向表添加隐藏列实现的。到此这个问题结束END
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2564160.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!