创建一个偶数以更新具有随机数的表列

时间:2018-11-16 21:31:34

标签: mysql events mariadb

我正在尝试使用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-未选择数据库。 我有一段时间没有做这种事情了。

2 个答案:

答案 0 :(得分:1)

让我们解决您的错误消息:

  • “需要成为超级用户”-EVENTs需要由特权用户创建。
  • “未选择数据库”-然后在USE some_db之前执行CREATE EVENT
  • “语法错误”-让我们看看详细信息。

您可以将RAND()存储在FLOAT列中(仅4个字节),而不是转换为整数。

您将如何处理随机数?

桌子多大? (任务会在一小时内完成吗?)

如果为列itemRandomize编制了索引,则此可能会加快处理速度:

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

我之所以说“可能”,是因为在最近的MySQL版本中,这类ALTERs发生了重大变化(提速)。我不知道MariaDB是否赶上了。

之所以删除并重新创建索引 可能是有益的,是因为UPDATE的成本很高-它必须从索引中删除一个条目,然后在其中插入一个新条目。新地方。

答案 1 :(得分:0)

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语句中定义数据库:

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