首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle /SQL使用随机sys_guid()并添加主键的重复行和空行

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

Stack Overflow用户
提问于 2016-11-23 16:24:34
回答 1查看 1.1K关注 0票数 0

我有一张有数百万排的大桌子。

它有一个GUID RAW(16字节)列。由于某种原因/疏忽,这个表从来没有主键约束,并且由于代码中的一个错误,在GUID列中插入了重复项(以及一些空值)。

我想做的是:

  • 用随机生成的GUID更新guid为NULL的所有行(可能使用SYS_GUID() )
  • 使用随机生成的GUID更新guid为副本的所有行。
  • 使用GUID列向表添加主键。

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-23 16:36:28

我会使用merge语句,类似于:

代码语言:javascript
运行
复制
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;

添加唯一索引,然后执行更新:

代码语言:javascript
运行
复制
update your_table
set    guid = sys_guid()
where  guid is null;

然后将guid列更改为不可空,最后添加主键约束。

或者,您可以在合并中将null和重复guid行更新为sys_guid(),但是您会面临创建重复guid的风险。尽管如此,最终的更新仍然可能失败,因为sys_guid()不一定能够生成唯一的值。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40769518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档