Запуск транзакции вызывает ошибку при создании события в phpMyAdmin - PullRequest
0 голосов
/ 29 сентября 2018

По какой-то причине phpMyAdmin не позволит мне создать событие с Начать транзакцию.Вот что я использую:

CREATE EVENT `set_history`
ON SCHEDULE
    EVERY 1 DAY STARTS '2018-9-29 00:00:00'
ON COMPLETION PRESERVE
DISABLE ON SLAVE
DO BEGIN

 START TRANSACTION;


INSERT INTO historical_transactions SELECT * FROM transactions WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

DELETE FROM `transactions` WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

UPDATE `accounts` SET `renew_at`= DATE_ADD(DATE(NOW()), INTERVAL 1 MONTH) WHERE `renew_at` = DATE(NOW());

COMMIT;
END

START TRANSACTION, INSERT, DELETE, UPDATE и COMMIT все работают при запуске вне события.Это ошибка, которую я продолжаю получать:

# 1064 - у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 8

Надеясь, что вы можете помочь.Спасибо.

1 Ответ

0 голосов
/ 29 сентября 2018

Вам нужно определить DELIMITER для чего-то другого (например: $$), отличного от (;), и переопределить его обратно в (;) в конце.

По сути, синтаксический анализатор PHPMyAdmin будетинтерпретировать ; как триггер выполнения, и он будет пытаться инициировать запрос, вместо того, чтобы воспринимать его целиком как оператор Create для события.Поэтому переопределение разделителя помогает обойти выполнение.

Выполните следующие действия:

DELIMITER $$
CREATE EVENT `set_history`
ON SCHEDULE
    EVERY 1 DAY STARTS '2018-9-29 00:00:00'
ON COMPLETION PRESERVE
DISABLE ON SLAVE
DO BEGIN

 START TRANSACTION;


INSERT INTO historical_transactions SELECT * FROM transactions WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

DELETE FROM `transactions` WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

UPDATE `accounts` SET `renew_at`= DATE_ADD(DATE(NOW()), INTERVAL 1 MONTH) WHERE `renew_at` = DATE(NOW());

COMMIT;
END $$
DELIMITER ;
...