Oracle PL/SQL 使用随机 sys_guid() 更新重复行和空行并添加主键

Oracle PL/SQL Update duplicate and null rows with random sys_guid() and add primary key

我有一个巨大的 table,有数百万行。

它有一个 GUID RAW(16 Byte) 列。对于某些 reason/oversight 这个 table 从来没有主键约束,并且由于代码中的错误,已将重复项插入 GUID 列(以及一些空值)

我想做的是:

不必保留 GUID 值,它们都必须是唯一的。但是有问题的 table 有大约 3 亿条记录,所以我正在寻找一种不会导致太多停机时间的方法。

谢谢

我会使用合并语句,类似于:

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 列更改为不可为空,最后添加主键约束。

或者,您可以在合并中将空的和重复的 guid 行更新到 sys_guid(),但是您 运行 有创建重复 guid 的风险。实际上,最终更新可能仍会失败,因为 sys_guid() 不一定保证生成唯一值。

就我个人而言,我会放弃 guid(尽管我意识到这并不总是可能的)并使用一个序列;这样更容易保证唯一性!