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