将随机数据插入到 MySql 中的表中
Posted
技术标签:
【中文标题】将随机数据插入到 MySql 中的表中【英文标题】:Inserting random data into a table in MySql 【发布时间】:2019-12-05 21:37:01 【问题描述】:有人可以帮我吗?我不知道这里有什么问题
DROP PROCEDURE IF EXISTS insertRandom;
CREATE PROCEDURE insertRandom()
BEGIN
DECLARE mytime timestamp;
SET mytime := '2009-01-01 00:00:00'
BEGIN
test_loop : LOOP
while mytime < now()
mytime = mytime + interval '8 hours';
insert into tempdata(temp_val, datum) values((select random()*(110)-10), mytime);
END LOOP;
END;
CALL insertRandom;
SELECT * FROM `temp_table`;
【问题讨论】:
请不要使用错误图片;并将错误文本翻译成英文,因为本网站仅支持英文。 【参考方案1】:您的代码中有很多错误
改用这个程序
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `insertRandom`()
BEGIN
DECLARE mytime timestamp;
SET mytime := '2009-01-01 00:00:00';
DROP TEMPORARY TABLE IF EXISTS tempdata;
CREATE TEMPORARY TABLE tempdata (temp_val BIGINT, datum timestamp);
test_loop : LOOP
IF mytime >= now() THEN
LEAVE test_loop;
END IF;
SET mytime = TIMESTAMPADD(HOUR,8,mytime);
insert into tempdata(temp_val, datum) values((select (rand()*110)-10), mytime);
END LOOP;
END$$
DELIMITER ;
然后
call insertRandom();
SELECT * FROM tempdata;
【讨论】:
“where's waldo”的 mysql 语法版本。【参考方案2】:看起来程序主体中的分号正在终止语句。我们需要 MySQL 将 CREATE PROCEDURE
视为单个语句,但 MySQL 会切断语句,当它看到分号时会看到完整的语句。
MySQL 中默认的语句分隔符是分号;
字符。可以覆盖默认分隔符;我们使用DELIMITER
语句进行更改。
此处示例将语句分隔符临时修改为两个美元符号字符$$
。在过程主体中,分号字符的出现不会终止语句...... MySQL 将继续读取,直到找到两个美元符号字符。 (不用说程序主体不应该包含$$
)
DELIMITER $$
DROP PROCEDURE IF EXISTS insertRandom $$
CREATE PROCEDURE insertRandom()
...
...
...
END$$
DELIMITER ;
CALL insertRandom();
请注意,我们使用DELIMITER
语句将分隔符改回分号字符。我没有检查程序主体是否有其他语法错误;但有些事情很突出。例如,这看起来不对
mytime = mytime + interval '8 hours';
那应该是SET
语句,语法是这样的:
SET mytime = mytime + INTERVAL 8 HOUR;
在SET
语句中,我们可以用:=
代替=
作为赋值运算符,所以等价
SET mytime := mytime + INTERVAL 8 HOUR;
对于 MySQL 存储程序的循环,我们可以执行 LOOP ... END LOOP
并包含 LEAVE
语句,或者我们可以使用 WHILE
循环,或者...
此处记录的语法:
https://dev.mysql.com/doc/refman/5.7/en/while.html
https://dev.mysql.com/doc/refman/5.7/en/loop.html
【讨论】:
以上是关于将随机数据插入到 MySql 中的表中的主要内容,如果未能解决你的问题,请参考以下文章
sql 一个表里已经 有20行数据 ,然后要从另一个表里随机抽取20条 覆盖掉之前的数据