Spec-Zone .ru
спецификации, руководства, описания, API
|
Если Вы определяете 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, "Деля и
Блокируя", для получения дополнительной информации.