【问题标题】:Adding a new column to an existing table in production向生产中的现有表添加新列
【发布时间】:2018-10-26 20:41:34
【问题描述】:

当该表包含一百万条记录并且它处于活动状态时,在生产 oracle 数据库中添加具有默认值的非空列的最佳方法是什么。如果我们创建列、添加默认值并在单个语句中使其不为空,它会创建任何锁吗?

【问题讨论】:

  • 如果表被压缩(或者它被分区并且有任何压缩分区或子分区),那么你不能一次性添加not null列,否则你会得到ORA- 39726:不支持对压缩表的添加/删除列操作。如果是这种情况,您必须将其分解为单独的步骤(添加不带默认值的可为空列、更新表、修改列)。

标签: oracle alter


【解决方案1】:

取决于版本。从11g开始,可以执行一个简单的ALTER TABLE命令,不会有影响,默认值不具体化,取自字典信息。

alter table tablename add columnname varchar2(2) default 'XX' not null;

上述语句不会对表的所有记录发出更新 [...] 当用户选择现有记录的列时,Oracle 从数据字典中获取有关默认值的事实 [...] ] 并且仍然不会因重做和撤消生成而受到任何惩罚 [...]

Source here,“添加具有默认值的列”一章

【讨论】:

  • 从 12.1 开始,我们可以使用增强的 default on null 语法,这也隐式地使列 not null
猜你喜欢
  • 2015-12-25
  • 2016-03-29
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2014-09-21
  • 2013-05-23
  • 2014-06-21
  • 2018-08-14
相关资源
最近更新 更多