【发布时间】:2018-01-27 03:41:46
【问题描述】:
我们最近将客户系统迁移到 Oracle 12c 和我们产品的最新版本。此过程包括运行大量迁移脚本,这些脚本主要是添加或更改表。我们注意到,在向表添加列的同时还提供默认值,会创建一个额外的隐藏列 SYS_NC00002$。
你应该可以用下面的代码重现这个
create table xxx (a integer);
alter table xxx add (b integer default 1);
select table_name, column_name, data_type, data_length, column_id, default_length, data_default from user_tab_cols where table_name='XXX';
Table_Name|column_Name |data_Type|data_Length|column_Id|default_Length|data_Default|
------------------------------------------------------------------------------------
XXX |A |NUMBER | 22| 1| | |
XXX |SYS_NC00002$|RAW | 126| | | |
XXX |B |NUMBER | 22| 2| 1|1 |
当我填充表格并查看隐藏列中的值时,它们都是相同的:
select distinct SYS_NC00002$ from xxx;
Sys_Nc00002$|
-------------
01 |
令人惊讶的是,当我没有立即设置默认值而是在一个额外的语句中,没有创建额外的隐藏列。
create table xxy (a integer);
alter table xxy add (b integer);
alter table xxy modify b default 1;
select table_name, column_name, data_type, data_length, column_id, default_length, data_default from user_tab_cols where table_name='XXY';
Table_Name|column_Name|data_Type|data_Length|column_Id|default_Length|data_Default|
-----------------------------------------------------------------------------------
XXY |A |NUMBER | 22| 1| | |
XXY |B |NUMBER | 22| 2| 1|1 |
谁能解释这个隐藏列的用途以及为什么它只在第一个示例中创建,而在第二个示例中没有?
【问题讨论】:
-
顺便说一句,我无法在 11g 上重现这个
-
我刚刚在12C上转载。不知道为什么!
-
是的,在 Oracle 支持support.oracle.com/knowledge/Oracle%20Database%20Products/…987654321@上找到了这个
-
与DDL优化有关。另一个有用的链接。:oracle.com/technetwork/articles/database/…
-
一个很好的博客,描述了 DDL 优化行为:raajeshwaran.blogspot.in/2014/11/ddl-optimization-in-12c.html。似乎当我们在创建或更改表时设置默认值以添加具有默认值的列时,此时 DDL 优化会添加隐藏列。但当我们将现有列修改为具有默认值时则不然。