【发布时间】:2013-09-02 08:07:17
【问题描述】:
在没有找到任何符合我需要的东西后,我编写了这段代码来不断地打乱 mysql 中列的值。有没有更好的方法来做到这一点?
**Original table:**
+----+-----------+
| id | fname |
+----+-----------+
| 1 | mike |
| 2 | ricky |
| 3 | jane |
| 4 | august |
| 6 | dave |
| 9 | Jérôme |
+----+-----------+
**Possible output:**
+----+-----------+
| id | fname |
+----+-----------+
| 1 | dave |
| 2 | jane |
| 3 | mike |
| 4 | ricky |
| 6 | Jérôme |
| 9 | august |
+----+-----------+
DROP TEMPORARY TABLE IF EXISTS shuffle1;
DROP TEMPORARY TABLE IF EXISTS shuffle2;
CREATE TEMPORARY TABLE shuffle1 (id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), original_values varchar(255), key original_values(original_values) );
CREATE TEMPORARY TABLE shuffle2 (id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), original_ids int(11), key original_ids(original_ids) );
INSERT INTO shuffle1 (id, original_values) SELECT NULL, table1.fname FROM table1 ORDER BY rand();
INSERT INTO shuffle2 (id, original_ids) SELECT NULL, table1.id FROM table1;
UPDATE table1 SET table1.fname = (SELECT shuffle1.original_values FROM shuffle1 JOIN shuffle2 ON shuffle2.id = shuffle1.id WHERE table1.id = shuffle2.original_ids);
【问题讨论】:
-
你的目标是什么?
-
数据清理:假设您有一个生产表,其中包含您的客户列表,其中包含两列 - first_name 和 last_name,您想在测试环境中使用它,但此信息很敏感。改组其中一列可以维护所有原始值和用户的隐私。
-
你可能会做的是复制整个数据库,然后打乱某些列的值,用随机数据替换它们。至少可以说,您在这里所做的事情相当令人困惑。
-
这是一种方法 - 但对于大量数据来说速度非常慢。但保留原始值而不是随机化数据的真正好处是,您知道您的测试涵盖了您的实际情况(例如特殊字符等),而不是基于开发人员做出的假设的一些随机数据。
-
我不确定您何时说要保留初始值和隐藏敏感信息。数据要么在数据库中,要么不在。如果您将数据库转储发送给开发人员,请确保随机数据在结构上与真实数据等效。也就是说,使字符概率与实际数据中的相似,字符串长度也在等效分布曲线中。