我有一张有数百万排的大桌子。
它有一个GUID RAW(16字节)列。由于某种原因/疏忽,这个表从来没有主键约束,并且由于代码中的一个错误,在GUID列中插入了重复项(以及一些空值)。
我想做的是:
GUID值不必保存,它们都必须是唯一的。但是这个表有大约3亿的记录,所以我正在寻找一种不会导致太多停机时间的方法。
谢谢
发布于 2016-11-23 16:36:28
我会使用merge语句,类似于:
merge into your_table tgt
using (select guid,
row_id
from (select guid,
rowid row_id,
row_number() over (partition by guid order by rowid) rn
from your_table)
where rn != 1) src
on (tgt.rowid = src.rowid)
when matched then
update set guid = null;
添加唯一索引,然后执行更新:
update your_table
set guid = sys_guid()
where guid is null;
然后将guid列更改为不可空,最后添加主键约束。
或者,您可以在合并中将null和重复guid行更新为sys_guid(),但是您会面临创建重复guid的风险。尽管如此,最终的更新仍然可能失败,因为sys_guid()不一定能够生成唯一的值。
就我个人而言,我会放弃guid (虽然我意识到这并不总是可能的),并使用一个序列;这更容易保证唯一性!
https://stackoverflow.com/questions/40769518
复制相似问题