создание четного для обновления столбцов таблицы случайными числами - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь создать событие, используя 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 голосов
/ 17 ноября 2018

Давайте исправим ваши сообщения об ошибках:

  • «Необходимо быть суперпользователем» - 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 - он должен удалитьзапись из индекса и вставка новой записи в новом месте.

0 голосов
/ 17 ноября 2018

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) + 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...