首页 > 解决方案 > 从列表中插入随机数据

问题描述

这些是我的表格列:

 ID || Date || Description || Priority

我的目标是插入 2000 行的随机测试数据,日期范围在(2019 年 7 月 1 日 - 2020 年 7 月 1 日)之间,并从列表(高、中、低)中随机化优先级。

我知道如何插入随机数,但我被日期和优先级字段卡住了。

如果我需要编写代码,有什么关于我该怎么做的指针吗?

只是想清楚一点-我在从给定列表中随机化和插入时遇到问题

标签: mysqlsqldatabase

解决方案


CREATE TABLE mytable (
  id SERIAL PRIMARY KEY,
  date DATE NOT NULL,
  description TEXT,
  priority ENUM('High','Medium','Low') NOT NULL
);

INSERT INTO mytable (date, priority)
  SELECT '2019-07-01' + INTERVAL FLOOR(RAND()*365) DAY, 
      ELT(1+FLOOR(RAND()*3), 'High', 'Medium', 'Low') 
  FROM DUAL;

假表DUAL是一个特殊的关键字。您可以从中进行选择,并且它始终只返回一行。但它没有包含数据的真实列,因此您只能选择表达式。

这样做 INSERT 几次,你会得到:

mysql> select * from mytable;                                                                                                                                       

+----+------------+-------------+----------+
| id | date       | description | priority |
+----+------------+-------------+----------+
|  1 | 2019-10-20 | NULL        | Medium   |
|  2 | 2020-05-17 | NULL        | High     |
|  3 | 2020-06-25 | NULL        | Low      |
|  4 | 2020-05-06 | NULL        | Medium   |
|  5 | 2019-09-30 | NULL        | High     |
|  6 | 2019-08-06 | NULL        | Low      |
|  7 | 2020-02-21 | NULL        | High     |
|  8 | 2019-11-10 | NULL        | High     |
|  9 | 2019-07-30 | NULL        | High     |
+----+------------+-------------+----------+

这里有一个技巧,使用表本身的行数来插入相同的行数,基本上是行数的两倍:

INSERT INTO mytable (date, priority)
  SELECT '2019-07-01' + INTERVAL FLOOR(RAND()*365) DAY, 
      ELT(1+FLOOR(RAND()*3), 'High', 'Medium', 'Low') 
  FROM mytable;

只需更改FROM DUALFROM mytableI 从选择一行更改为从表中选择当前行数。但是我插入的值仍然是随机表达式,而不是那些行中已经存在的值。所以我得到带有新随机值的新行。

然后重复此 INSERT 多次,以使行数加倍。

另请阅读ELT() 函数


推荐阅读