创建一个偶数以使用随机数更新表列

w51jfk4q  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(278)

我正在尝试使用mysql(mariadb)创建一个事件,每1小时用随机数更新一个名为“itemrandomize”的列的每一行。我尝试了几种方法,得到的不是错误语法就是必需的超级用户。

SET GLOBAL event_scheduler = ON;
CREATE EVENT main
DO
UPDATE main SET itemRandomize = FLOOR(RAND() * 100000000);

我的旧学校代码进行了更新(但没有随机化),类似于:

SET GLOBAL event_scheduler = ON;
CREATE EVENT itemupdater
ON SCHEDULE EVERY 1 HOUR STARTS '2013-10-26 06:36:00'
DO
UPDATE items SET shopStockCurrent=shopStockMax;

我也得到一个错误,说#1046-没有选择数据库。我好久没做这种事了。

atmip9wb

atmip9wb1#

让我们解决您的错误消息:
“需要成为超级用户”- EVENTs 需要由特权用户创建。
“未选择数据库”--然后执行 USE some_db 之前 CREATE EVENT .
“语法错误”--让我们看看细节。
您可以简单地存储 RAND() 在一个 FLOAT 列(仅4字节)。
你要用随机数做什么?
这张table有多大(任务一小时后完成吗?)
如果列 itemRandomize 索引,这可能会加快速度:

ALTER TABLE DROP INDEX itemRandomize;
UPDATE ... SET itemRandomize ...;
ALTER TABLE ADD INDEX(itemRandomize);

我说“可能”是因为这类问题已经发生了重大变化(加速) ALTERs 在最近的mysql版本中。我不知道mariadb是否赶上了。
删除并重新创建该指数可能是有益的,原因在于该指数的成本有多高 UPDATE 它必须从索引中删除一个条目,并在新位置插入一个新条目。

ncgqoxb0

ncgqoxb02#

rand()-是一个非常慢的函数。尝试这样的事情(对不起,我不检查我的代码):

SET @tm = UNIX_TIMESTAMP();
UPDATE main SET itemRandomize = FLOOR( SIN( @tm + `id`) * 100000000) + 100000000;
``` `+ 100000000` 如果需要,只需要正值
你说: `I am also getting an error that says #1046 - No database selected.` ```
use [myDatabseName];
...
[your SQL-code here]
...

或者在sql语句中定义db:

UPDATE [myDatabseName].main SET itemRandomize = FLOOR( SIN( @tm + `id`) * 100000000) +

相关问题