Spec-Zone .ru
спецификации, руководства, описания, API

13.2.5.3. INSERT ... ONDUPLICATE KEY UPDATE Синтаксис

Если Вы определяете ON DUPLICATE KEY UPDATE, и строка вставляется, который вызвал бы двойное значение в a UNIQUE индексируйте или PRIMARY KEY, MySQL выполняет UPDATE из старой строки. Например, если столбец a объявляется как UNIQUE и содержит значение 1, следующие два оператора имеют подобный эффект:

INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=c+1;UPDATE table SET c=c+1 WHERE a=1;

(Эффекты не идентичны для InnoDB таблица, где a столбец автоприращения. Со столбцом автоприращения, INSERT оператор увеличивает автоинкрементное значение, но UPDATE не делает.)

ON DUPLICATE KEY UPDATE пункт может содержать многократные присвоения столбца, разделенные запятыми.

С ON DUPLICATE KEY UPDATE, значение влиявших строк на строку 1, если строка вставляется как новая строка, 2, если существующая строка обновляется, и 0, если существующая строка устанавливается в ее текущую стоимость. Если Вы определяете CLIENT_FOUND_ROWS флаг к mysql_real_connect() соединяясь с mysqld, значение влиявших строк 1 (не 0), если существующая строка устанавливается в ее текущую стоимость.

Если столбец b также уникально, INSERT эквивалентно этому UPDATE оператор вместо этого:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

Если a=1 OR b=2 соответствия несколько строк, только одна строка обновляется. Вообще, следует попытаться избегать использования ON DUPLICATE KEY UPDATE пункт на таблицах с многократными уникальными индексами.

Можно использовать VALUES(col_name) функция в UPDATE пункт, чтобы обратиться к значениям столбцов от INSERT часть INSERT ... ON DUPLICATE KEY UPDATE оператор. Другими словами, VALUES(col_name) в ON DUPLICATE KEY UPDATE пункт относится к значению col_name это было бы вставлено, не имел никакого двойного ключевого произошедшего конфликта. Эта функция особенно полезна в многократной строке, вставляет. VALUES() функция значима только в INSERT ... UPDATE операторы и возвраты NULL иначе. Пример:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

Тот оператор идентичен следующим двум операторам:

INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=3;INSERT INTO table (a,b,c) VALUES (4,5,6)  ON DUPLICATE KEY UPDATE c=9;

Если таблица содержит AUTO_INCREMENT столбец и INSERT ... ON DUPLICATE KEY UPDATE вставляет или обновляет строку, LAST_INSERT_ID() функционируйте возвращается AUTO_INCREMENT значение.

DELAYED опция игнорируется, когда Вы используете ON DUPLICATE KEY UPDATE.

Поскольку результаты INSERT ... SELECT операторы зависят от упорядочивания строк от SELECT и этот порядок не может всегда гарантироваться, это возможно, регистрируя INSERT ... SELECT ON DUPLICATE KEY UPDATE операторы для ведущего устройства и ведомого устройства, чтобы отклониться. Таким образом, в MySQL 5.6.4 и позже, INSERT ... SELECT ON DUPLICATE KEY UPDATE операторы отмечаются как опасные для основанной на операторе репликации. С этим изменением такие операторы производят предупреждение в журнале при использовании основанного на операторе режима и регистрируются, используя основанный на строке формат при использовании MIXED режим. Кроме того, начинаясь с MySQL 5.6.6, INSERT ... ON DUPLICATE KEY UPDATE оператор против таблицы, имеющей больше чем один уникальный или первичный ключ, также отмечается как опасный. (Ошибка #11765650, Ошибка #58637), См. также Раздел 16.1.2.1, "Преимущества и Недостатки Основанной на операторе и Построчной репликации".

До MySQL 5.6.6, INSERT ... ON DUPLICATE KEY UPDATE на разделенной таблице, используя механизм хранения такой как MyISAM это использует блокировки на уровне таблицы, заблокированные все разделы таблицы. (Это не сделало и не происходит с таблицами, используя механизмы хранения такой как InnoDB та работа блокировка на уровне строки.) В MySQL 5.6.6 и позже, такие операторы блокируют только те разделы, в которых обновляется ключевой столбец разделения. См. Раздел 18.6.4, "Деля и Блокируя", для получения дополнительной информации.