Mysql 按列类型更新表
我有一个包含敏感数字的大型MYSQL数据表。我们需要一家外部公司为我们制作一个应用程序来使用这些数据。我们不想给他们真实的数字。相反,我想伪造数据。这就是我正在尝试的 样本表Mysql 按列类型更新表,mysql,Mysql,我有一个包含敏感数字的大型MYSQL数据表。我们需要一家外部公司为我们制作一个应用程序来使用这些数据。我们不想给他们真实的数字。相反,我想伪造数据。这就是我正在尝试的 样本表 Name<varChar> | col1 <int>| col2 <decimal>| coln <int> Joe | 1 | 2 | 3 但缺少以下内容: 1) 仅更新一列 2) 不验证列是否为数字数据 有人
Name<varChar> | col1 <int>| col2 <decimal>| coln <int>
Joe | 1 | 2 | 3
但缺少以下内容:
1) 仅更新一列
2) 不验证列是否为数字数据
有人能帮你使用这个sql脚本吗。我知道你想用Java来实现这一点。您可以使用系统表或
ResultSetMetaData
完全自动化此操作
伪代码:
- 获取与数字数据类型匹配的用户表和列的完整列表,按表名排序。(MySQL应该有一个SQL查询来从系统表或视图中获取此信息。)
- 对于每个表,构建并执行update语句,使用随机乘法更新所有列
- 获取用户表的完整列表
- 对于每个表,获取一行数据(不管是哪一行,因为您不会迭代
)ResultSet
- 使用
对象获取列名和数据类型ResultSetMetaData
- 生成并执行update语句,用随机乘法更新与数字数据类型匹配的所有列
和往常一样,在一个小的测试数据库上运行该程序,该数据库可以用数据库构建脚本重置。它应该包含一些表,这些表包含各种数据类型的列和数据。如果您只想在mysql中执行此操作,请使用java执行此查询
UPDATE table t,
(
SELECT id,
col1*FLOOR(RAND() * 9) +1 as c1,
col2*FLOOR(RAND() * 9) +1 as c2,
col3*FLOOR(RAND() * 9) +1 as c3
FROM table
) as temp
SET temp.c1 = t.col1, temp.c2 = t.col2, temp.c3 = t.col3 WHERE t.id = temp.id;
有两件事:首先假设每行都有一个唯一的id,因为所有规范化的表都应该有这个idSECOND您的随机数范围可以更改为您想要的任何值。您所要做的就是将FLOOR(RAND()*9)
更改为其他值。。。地板(最小*最大)。。因此,将9设为不同的数字以更改范围。我在末尾添加1的原因是,如果您不希望数字更改为0,请在地板后添加一个,使其至少为1
编辑: 要检查其是否为数字,则只需进行简单的if比较,如下所示:
UPDATE table t,
(
SELECT id,
IF(col1 >=0, col1*FLOOR(RAND() * 9) +1, col1) as c1,
IF(col2 >=0, col2*FLOOR(RAND() * 9) +1, col2) as c2,
IF(col3 >=0, col3*FLOOR(RAND() * 9) +1, col3) as c3
FROM table
) as temp
SET temp.c1 = t.col1, temp.c2 = t.col2, temp.c3 = t.col3 WHERE t.id = temp.id;
这里有一个只有mysql的解决方案。您可以按类型查询
信息\u模式
表中的列,然后使用变量构造sql查询
mysql> CREATE TABLE example (
-> id INT,
-> data VARCHAR(100),
-> id2 INT,
-> id3 decimal,
-> id4 double,
-> id5 float,
-> id6 numeric
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> insert into example values (1,'hello',2,3,4,5,6);
Query OK, 1 row affected (0.05 sec)
mysql> SET @sql = NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT GROUP_CONCAT(CONCAT(column_name,'=ROUND(',column_name,'*RAND())'))
-> INTO @sql
-> FROM information_schema.columns
-> WHERE table_schema = 'test' -- your db name
-> AND table_name = 'example'
-> AND (column_type LIKE '%int%'
-> OR column_type LIKE '%decimal%'
-> OR column_type LIKE '%numeric%'
-> OR column_type LIKE '%float%'
-> OR column_type LIKE '%double%');
Query OK, 1 row affected (0.00 sec)
mysql> SET @sql1 = CONCAT("UPDATE example SET ",@sql);
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE stmt FROM @sql1;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from example;
+------+-------+------+------+------+------+------+
| id | data | id2 | id3 | id4 | id5 | id6 |
+------+-------+------+------+------+------+------+
| 0 | hello | 0 | 3 | 4 | 1 | 3 |
+------+-------+------+------+------+------+------+
1 row in set (0.00 sec)
mysql> select @sql1;
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| @sql1 |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| UPDATE example SET id=ROUND(id*RAND()),id2=ROUND(id2*RAND()),id3=ROUND(id3*RAND()),id4=ROUND(id4*RAND()),id5=ROUND(id5*RAND()),id6=ROUND(id6*RAND()) |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
“乘”和“除”的区别是没有意义的,因为a/3与*03333相同。。。也许因子的分布很重要。除法并不会增加过程的随机性:如果你所乘的数字是随机的,你可以把它看作是一个除以该数字的随机倒数。@dasblinkenlight你们关于乘法的看法是对的。我可以简单地假设Rant()不理解您的2)-运行descripe sample_表将让您知道col是如何定义的。可以使用CAST()函数将str转换为float。祝你好运。@user3741598我想自动化这个过程。我知道如何通过手动干预来实现这一点。FuzzyTree出现错误<代码>查询:从@sql1准备stmt错误代码:1064您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解第1行“”附近使用的正确语法我认为问题在于我有太多的列,并且设置了
@sql
的select group_concat….
语句被截断<代码>第33行被组\u CONCAT()剪切。添加设置会话组\u CONCAT\u max\u len=1000000
要解决concat问题,您必须这样做。谢谢你的帮助!
mysql> CREATE TABLE example (
-> id INT,
-> data VARCHAR(100),
-> id2 INT,
-> id3 decimal,
-> id4 double,
-> id5 float,
-> id6 numeric
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> insert into example values (1,'hello',2,3,4,5,6);
Query OK, 1 row affected (0.05 sec)
mysql> SET @sql = NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT GROUP_CONCAT(CONCAT(column_name,'=ROUND(',column_name,'*RAND())'))
-> INTO @sql
-> FROM information_schema.columns
-> WHERE table_schema = 'test' -- your db name
-> AND table_name = 'example'
-> AND (column_type LIKE '%int%'
-> OR column_type LIKE '%decimal%'
-> OR column_type LIKE '%numeric%'
-> OR column_type LIKE '%float%'
-> OR column_type LIKE '%double%');
Query OK, 1 row affected (0.00 sec)
mysql> SET @sql1 = CONCAT("UPDATE example SET ",@sql);
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE stmt FROM @sql1;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from example;
+------+-------+------+------+------+------+------+
| id | data | id2 | id3 | id4 | id5 | id6 |
+------+-------+------+------+------+------+------+
| 0 | hello | 0 | 3 | 4 | 1 | 3 |
+------+-------+------+------+------+------+------+
1 row in set (0.00 sec)
mysql> select @sql1;
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| @sql1 |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| UPDATE example SET id=ROUND(id*RAND()),id2=ROUND(id2*RAND()),id3=ROUND(id3*RAND()),id4=ROUND(id4*RAND()),id5=ROUND(id5*RAND()),id6=ROUND(id6*RAND()) |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)