我需要在Oracle 11g上更新大型索引组织表(2000万行)的主键。
是否可以使用多个UPDATE查询执行此操作?即,一次说100,000个行的许多较小的UPDATE。问题是这些UPDATE批次中的一个可能会暂时产生一个重复的主键值(在所有UPDATE完成后都没有重复。)
所以,我想我问是否可能暂时禁用主键约束(但这是IOT所需的!)或者以某种其他方式临时更改表。我可以对此表进行独占和离线访问。
我能看到的唯一解决方案是创建一个新表,完成后,删除原始表并将新表重命名为原始表名。
我错过了另一种可能性吗?
答案 0 :(得分:0)
您无法从IOT禁用/删除主键约束,因为根据定义它是唯一索引。
当我需要更改这样的IOT时,我要么为新的普通堆表执行CTAS(创建表),进行维护,然后CTAS新的IOT。
类似的东西:
create table t_temp as select * from t_iot;
-- do maintenance
create table t_new_iot as select * from t_temp;
但是,如果您需要简单地向现有密钥添加或加入新字段,则可以通过创建新的IOT结构一步完成此操作,然后使用查询直接从旧IOT填充。
不幸的是,这是物联网的缺点之一。
答案 1 :(得分:0)
我建议采用以下方法:
使用单个分区创建由系统分区的新IOT表 与当前结构完全相同。
锁定当前IOT表以防止任何DML。
插入新表中,从当前表中选择更改select中的PK值。这一步 如果需要,可以重复几次。在这种情况下,它会更好 在另一个会话中执行此操作以保持对原始表的锁定。
用原始表交换新表的分区。