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 更新 GUID 为 NULL 的所有行(可能使用 SYS_GUID())
- 用随机生成的 GUID 更新所有 GUID 重复的行
- 使用 GUID 列将主键添加到 table。
不必保留 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(尽管我意识到这并不总是可能的)并使用一个序列;这样更容易保证唯一性!
我有一个巨大的 table,有数百万行。
它有一个 GUID RAW(16 Byte) 列。对于某些 reason/oversight 这个 table 从来没有主键约束,并且由于代码中的错误,已将重复项插入 GUID 列(以及一些空值)
我想做的是:
- 使用随机生成的 GUID 更新 GUID 为 NULL 的所有行(可能使用 SYS_GUID())
- 用随机生成的 GUID 更新所有 GUID 重复的行
- 使用 GUID 列将主键添加到 table。
不必保留 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(尽管我意识到这并不总是可能的)并使用一个序列;这样更容易保证唯一性!