вторник, 16 ноября 2010 г.

Конструкция INSERT ... ON DUPLICATE KEY UPDATE

Суть этой контсрукции в том, что если мы пытаемся вставить строку и среди вставляемых ячеек есть одна с уже существующим уникальным значением, то мы обновим  указанные после слова UPDATE ячейки. Если такой уникальной ячейки нет, то мы просто добавим новую строку.


Пример:
A - unique

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

Если а в таблице есть a=1, то это тоже самое что:

UPDATE table SET c=c+1 WHERE a=1;

Более понятный пример, обьясняющий "как это все начиналось":

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

Если вставлять много строк одновременно в одном интсрте, то придет на помощь функция VALUES() -- эта функция вне конструкции INSERT ... ON DUPLICATE KEY 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;

Есть интересная задача. К примеру у нас есть в таблице праймери кей с автоинкриментом и уникальная колонка А. Мы пользуемся этой славной конструкцией, но желаем, если сработает апдейт, то айдишник должен стать последним инкрементом в таблице, а не остаться со старым. Это делается так:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), b=2, c=3;

Комментариев нет:

Отправить комментарий