Mysql 按列类型更新表

Mysql 按列类型更新表,mysql,Mysql,我有一个包含敏感数字的大型MYSQL数据表。我们需要一家外部公司为我们制作一个应用程序来使用这些数据。我们不想给他们真实的数字。相反,我想伪造数据。这就是我正在尝试的 样本表 Name<varChar> | col1 <int>| col2 <decimal>| coln <int> Joe | 1 | 2 | 3 但缺少以下内容: 1) 仅更新一列 2) 不验证列是否为数字数据 有人

我有一个包含敏感数字的大型MYSQL数据表。我们需要一家外部公司为我们制作一个应用程序来使用这些数据。我们不想给他们真实的数字。相反,我想伪造数据。这就是我正在尝试的

样本表

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)