1 Востаннє редагувалося ktretyak (26.07.2015 20:16:58)

Тема: Як працює 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
;

2

Re: Як працює MySQL вираз "on duplicate key update"

ON DUPLICATE KEY досить зручна штука для підрахунку статистичних даних.
Вставляємо рядок а якщо його немає - оновлюємо лічильник на 1ницю

INSERT INTO website_stat 
SET type='active_users', `date`='2015-07-26', num=1 
ON DUPLICATE KEY num=num+1

Оновлено: додав кому в запиті

3

Re: Як працює MySQL вираз "on duplicate key update"

У вашому запиті пропущено кому перед num=1.

Стосовно того, що у даному запиті не використовується функція values(), то такий варіант проходить, якщо в цій операції бере участь одна таблиця. А вже коли вибірка відбувається з однієї таблиці а вставка/оновлення в іншій, то тут без values() не обійтись, бо буде неоднозначність назв полів.

4

Re: Як працює MySQL вираз "on duplicate key update"

@ktretyak дякую за кому ;)
так, з values ви праві ;)

5

Re: Як працює MySQL вираз "on duplicate key update"

Ну це я так, не хотів прискіпуватись, просто мій уявний парсер не пропускає таке =).

До речі цікаво, а як це ви дописали кому і при цьому не показується що ви редагували повідомлення? У вас доступ  до бази форума є?