使用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)

看起来很顺利呢。

广告
将在 10 秒后关闭
bannerAds