Тема: Як працює MySQL вираз "on duplicate key update"
Виявляється у MySQL є такий цікавий SQL-синтаксис, який дозволяє вставляти нові рядки в таблицю, але якщо по унікальним полям виникає дублікат, то тут же можна написати вираз для оновлення цього рядка.
Я спершу, не сильно так і приглядаючись в доку, почав писати звичайний update на тому місті де on duplicate key update. В моєму випадку вставлялось значення не так як у прикладі в документації, тобто із values(), а із вибірки.
Але, як виявилось, тут є специфіка:
1. після ключового слова update не потрібно писати назву таблиці
2. не потрібно прописувати join із таблицею, з якої робиться вибірка
3. не потрібно писати ключове слово set
4. всі значення полів із вибірки можна отримати у конструкції update за допомогою функції values()
В документації показано як це робиться, але читаючи її "по діагоналі", не помітив що функція values() може використовуватись не лише для вставки:
DROP TEMPORARY TABLE IF EXISTS tmp_test;
CREATE TEMPORARY TABLE tmp_test
(
col1 INT(2),
col2 INT(3),
PRIMARY KEY ( col1 )
)
;
INSERT INTO tmp_test VALUES(1,2), (2,3), (3,4), (4,5);
INSERT INTO tmp_test (col1, col2)
SELECT
col1
,col2
FROM tmp_test
ON DUPLICATE KEY
UPDATE
col1 = VALUES(col1)
,col2 = VALUES(col2)
;
SELECT * FROM tmp_test
;