Oracle 10g环境下随机化联系人表数据的技术实现咨询
实现Oracle 10g联系人表姓名随机化方案
嘿,针对你需要先复制联系人表再随机化姓名的需求,咱们可以用Oracle 10g支持的窗口函数和随机函数来实现,具体步骤如下:
第一步:复制原联系人表
首先咱们把生产库的联系人表(假设原表名为CONTACTS)完整复制一份,用来做后续的匿名化操作,绝对不能直接碰生产数据:
CREATE TABLE CONTACTS_ANON AS SELECT * FROM CONTACTS;
注意:这个语句只会复制表结构和数据,原表的主键、索引、约束不会自动同步,要是后续需要可以手动添加。
第二步:随机更新FIRST_NAME字段
咱们通过给原表和复制表分别生成随机排序的行号,然后按行号关联,用原表的随机行来覆盖复制表的FirstName:
MERGE INTO CONTACTS_ANON ca USING ( -- 给原表的行按随机顺序生成行号 SELECT c.FIRST_NAME, ROW_NUMBER() OVER (ORDER BY DBMS_RANDOM.VALUE) AS rn FROM CONTACTS c ) r1 ON (ca.ROWID = (SELECT ROWID FROM ( -- 给复制表的行也按随机顺序生成行号,和原表的行号一一匹配 SELECT ROWID, ROW_NUMBER() OVER (ORDER BY DBMS_RANDOM.VALUE) AS rn FROM CONTACTS_ANON ) ca_rn WHERE ca_rn.rn = r1.rn)) WHEN MATCHED THEN UPDATE SET ca.FIRST_NAME = r1.FIRST_NAME;
第三步:随机更新LAST_NAME字段
和第二步逻辑一致,但这次要生成全新的随机关联关系,确保LastName的随机来源和FirstName完全独立:
MERGE INTO CONTACTS_ANON ca USING ( SELECT c.LAST_NAME, ROW_NUMBER() OVER (ORDER BY DBMS_RANDOM.VALUE) AS rn FROM CONTACTS c ) r2 ON (ca.ROWID = (SELECT ROWID FROM ( SELECT ROWID, ROW_NUMBER() OVER (ORDER BY DBMS_RANDOM.VALUE) AS rn FROM CONTACTS_ANON ) ca_rn WHERE ca_rn.rn = r2.rn)) WHEN MATCHED THEN UPDATE SET ca.LAST_NAME = r2.LAST_NAME;
额外提醒
- 操作前建议先开事务:执行
BEGIN;,更新完后检查数据没问题再COMMIT;,要是出问题直接ROLLBACK;就行 - Oracle 10g里
DBMS_RANDOM.VALUE是稳定的随机数生成函数,用来做随机排序完全靠谱 - 如果原表数据量特别大,建议在业务低峰期操作,避免影响生产业务
内容的提问来源于stack exchange,提问作者TomBridges
相关产品推荐
相关产品推荐

