Я установил 1 mysql-события, которые передают все данные с флагом 0
из одной таблицы в другую (таблица 2) каждые 12 часов, а затем обновляют запрос, чтобы установить как 1
флаг после передачи. INSERT
и UPDATE
находятся в одном событии.
Моя проблема заключается в том, что все перенесенные данные дублируются в таблице 2, которая выглядит как 2 события.
Любая идея?
Вот мои коды событий:
DELIMITER |
CREATE
EVENT
IF NOT EXISTS
event_transfer
ON SCHEDULE EVERY 12 HOUR
STARTS '2018-08-10 06:00:00'
ON COMPLETION NOT PRESERVE
ENABLE DO BEGIN INSERT INTO dbsample.tblmirror(Column1, Column2, Column3) (SELECT Column1, Column2, Column3 FROM tblmaster WHERE is_transfer = 0); UPDATE dbsample.tblmaster SET is_transfer = 1 WHERE is_transfer = 0; END | DELIMITER;
Цитируя P.Salmon:
Никакого дублирующегося события, простого кода и триггеров. Я сомневаюсь, что проблема здесь вообще.
П.Салмон прямо здесь, и было бы хорошо, если бы вы выяснили, какая другая работа это делает.
Но вы также можете избежать этой проблемы по-другому. Поскольку вы не хотите иметь дубликаты, есть способ обнаружить дубликаты, не так ли? Будь то, что комбинация этих трех столбцов должна быть уникальной или что-то еще, тогда укажите это в своей базе данных.
Создайте уникальный индекс (или первичный ключ) в столбцах, которые делают каждую строку уникальной.
Затем вместо простого INSERT
вы INSERT IGNORE
и voilà, у вас больше не будет дубликатов.
Указание руководства:
Если вы используете модификатор IGNORE, ошибки, возникающие при выполнении инструкции INSERT, игнорируются. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с дубликат-ключом, и оператор прерывается. С IGNORE строка отбрасывается и ошибок не возникает. Игнорируемые ошибки могут генерировать предупреждения вместо этого, хотя ошибок с дубликат-ключом нет.