批量更新整个表的列值

时间:2011-07-01 07:58:01

标签: oracle11g

我们有一个大约3500万行的Oracle 11g数据库表。我们处于这样一种情况,我们必须更新一列的所有值。此列已编入索引。

我有一个可以生成更新值的脚本,可以在文本文件中填充它。

我正在寻找一个好的策略来对此表进行批量更新。我们可以承受大约10个小时的停机时间。

是不是一个好主意
  • 将整个表转储为平面文件
  • 使用任何脚本语言更新值
  • 重新加载整个表格
  • 重建索引

人们可能遇到的陷阱是什么?

我不能胜任PL / SQL。有没有办法在PL / SQL中解决这个问题,或者在数据库本身“内部”解决这个问题?

谢谢, 帕布

1 个答案:

答案 0 :(得分:1)

最快的方法可能是根据更新值的平面文件创建external table,然后:

create table new_table as
  select o.col1, o.col2, o.col3, ..., x.value as colN
  from old_table o
  join extern_table x on ...;

(确保join返回old_table中的所有行。连接可能需要是外连接。)

-- drop foreign key constraints that reference old_table
alter table child1 drop constraint fk_to_old_table1;
...

drop table old_table;

rename new_table to old_table;

-- Re-create indexes and constraints on old_table
alter table old_table add constraint oldpk primary key (col1);
...

-- Re-create the dropped foreign key constraints to old_table
alter table child1 add constraint fk_to_old_table1 ...;
...