ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe

При переходе на MySQL 5.5 с репликацией стали возникать ошибки:

Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. 
INSERT... ON DUPLICATE KEY UPDATE  on a table with more than one UNIQUE KEY is unsafe Statement: INSERT INTO Table
                    (zabbix_event_id, next_report_after)
                VALUES
                    (8273354, NOW()), (8273312, NOW())
                ON DUPLICATE KEY UPDATE
                    next_report_after = next_report_after


Таблица при этом выглядела так:

CREATE TABLE IF NOT EXISTS Table (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `uniq` INT(10) UNSIGNED NOT NULL,
  `next_report_after` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY ( `uniq` )
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Собственно, в MySQL 5.5 «пофиксили баг«, что свелось к тому, что теперь нельзя реплицировать результаты запросов, в которых есть ON DUPLICATE KEY UPDATE и больше одного уникального ключа.
Пришлось переделывать логику с выпиливанием столбца uniq.
В общем, MySQL молодцы, сломали обратную совместимость для устранения мелкого бага.
Ссылка на документацию — http://docs.oracle.com/cd/E17952_01/refman-5.5-en/insert-on-duplicate.html (об этом в самом низу).

One Response so far.

  1. Craigtrush:
    option takes a list of the comma-separated names of one or more partitions or subpartitions (or both) of the table. If any of the rows to be inserted by a given

LEAVE A COMMENT