如何用另一张表的列数据替换当前表字段值实现数据脱敏
核心问题说明
你的整体思路方向没有问题,但是具体SQL操作存在两处严重错误,导致没有效果:
- 使用了
INSERT语句而非UPDATE语句:INSERT是向users表插入全新的行,原有存储真实姓名的行没有任何改动,自然达不到打乱原有姓名的效果。 - 只处理了
first_name字段,既没有对last_name做随机打乱,也没有建立随机后的字段值和原表行的对应关系,无法完成逐行更新。
可用实现方案(MySQL环境)
- 先给原表添加临时自增行号,用于后续关联更新:
ALTER TABLE users ADD COLUMN temp_row_id INT AUTO_INCREMENT PRIMARY KEY;
- 分别生成随机排序的名、姓序列,各自绑定连续行号:
-- 生成打乱后的first_name序列 CREATE TABLE shuffled_first AS SELECT first_name, ROW_NUMBER() OVER (ORDER BY RAND()) AS row_id FROM users; -- 生成打乱后的last_name序列 CREATE TABLE shuffled_last AS SELECT last_name, ROW_NUMBER() OVER (ORDER BY RAND()) AS row_id FROM users;
- 关联临时表更新原表的姓名字段:
UPDATE users u JOIN shuffled_first sf ON u.temp_row_id = sf.row_id JOIN shuffled_last sl ON u.temp_row_id = sl.row_id SET u.first_name = sf.first_name, u.last_name = sl.last_name;
- 清理临时资源:
ALTER TABLE users DROP COLUMN temp_row_id; DROP TABLE shuffled_first, shuffled_last;
如果你使用的是不支持窗口函数的旧版本MySQL,可以用用户变量的方式生成行号,整体逻辑完全一致。
内容的提问来源于stack exchange,提问作者pmccullagh
相关产品推荐
相关产品推荐

