使用MariaDB创建随机测试数据
我想快速创建一个在一定范围内具有随机值的表。
环境
MariaDB [test]> status
--------------
mysql Ver 15.1 Distrib 10.6.7-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
Connection id: 2445
Current database: test
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.6.7-MariaDB-2ubuntu1.1 Ubuntu 22.04
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb3
Conn. characterset: utf8mb3
UNIX socket: /run/mysqld/mysqld.sock
.
.
.
军事行动
我一开始以为可以在插入(insert)中插入随机数据… 不过,插入语法似乎需要逐行指定数据。在存储过程中循环插入也很麻烦。所以我决定采用以下策略。
-
- ランダムでない行を insert してから ランダムに update するのが良い
insert ~ select で 自分自身を倍々に増やすのが最もお手軽
ユニークキーの値だけ気をつける
update はフォーマットに応じてrnd関数を加工する
最后,我们采取了下面所示的方法。
「如何在MySQL中简单创建随机测试数据」
初期的表格的状态如下所示。
MariaDB [test]> select * from 会員成績;
+------+---------------------+--------------+--------+
| stid | 日時 | 会員番号 | 成績 |
+------+---------------------+--------------+--------+
| 1 | 0000-00-00 00:00:00 | 4 | 0 |
| 2 | 0000-00-00 00:00:00 | 6 | 0 |
| 3 | 0000-00-00 00:00:00 | 6 | 0 |
| 4 | 0000-00-00 00:00:00 | 1 | 0 |
| 5 | 0000-00-00 00:00:00 | 8 | 0 |
+------+---------------------+--------------+--------+
5 rows in set (0.001 sec)
将这个放大四倍,然后变成80行。
除了自动增量的 stid 字段外,每个字段都需要逐一指定。
MariaDB [test]> INSERT INTO 会員成績(日時,会員番号,成績) SELECT 日時,会員番号,成績 FROM 会員成績;
Query OK, 5 rows affected (0.020 sec)
Records: 5 Duplicates: 0 Warnings: 0
MariaDB [test]> INSERT INTO 会員成績(日時,会員番号,成績) SELECT 日時,会員番号,成績 FROM 会員成績;
Query OK, 10 rows affected (0.017 sec)
Records: 10 Duplicates: 0 Warnings: 0
MariaDB [test]> INSERT INTO 会員成績(日時,会員番号,成績) SELECT 日時,会員番号,成績 FROM 会員成績;
Query OK, 20 rows affected (0.015 sec)
Records: 20 Duplicates: 0 Warnings: 0
MariaDB [test]> INSERT INTO 会員成績(日時,会員番号,成績) SELECT 日時,会員番号,成績 FROM 会員成績;
Query OK, 40 rows affected (0.018 sec)
Records: 40 Duplicates: 0 Warnings: 0
将其更新为合适的数值。
MariaDB [test]> UPDATE 会員成績 SET
会員番号 = CEIL(RAND() * 5),
成績 = CEIL(RAND() * 100),
日時 = ADDTIME(
CONCAT_WS(' ',
'2012-01-01' + INTERVAL RAND() * 3653 DAY, '00:00:00'),
SEC_TO_TIME(FLOOR(0 + (RAND() * 86401))));
:
Query OK, 80 rows affected (0.019 sec)
Rows matched: 80 Changed: 80 Warnings: 0
时间范围为2012年至2022年之间。
由于采用CEIL函数舍入,会员编号可为1至5之间的任意数字,成绩可为1至100之间的任意数字。
如果将范围设为包括零,则需要稍作调整。
MariaDB [test]> select * from 会員成績;
+------+---------------------+--------------+--------+
| stid | 日時 | 会員番号 | 成績 |
+------+---------------------+--------------+--------+
| 1 | 2019-02-18 12:14:06 | 4 | 36 |
| 2 | 2015-09-08 06:48:52 | 3 | 52 |
| 3 | 2018-07-04 02:19:29 | 2 | 72 |
| 4 | 2014-09-12 05:27:12 | 3 | 38 |
.
.
.
| 96 | 2020-10-15 14:53:29 | 2 | 60 |
| 97 | 2021-07-05 08:15:31 | 3 | 47 |
| 98 | 2021-05-26 18:31:07 | 5 | 31 |
+------+---------------------+--------------+--------+
80 rows in set (0.001 sec)
看起来很顺利呢。