Главная > Новости > INSERT UPDATE в одном флаконе

INSERT UPDATE в одном флаконе

Довольно часто приходилось писать разного рода парсеры, например обновление товаров интернет-магазина из csv-файла. Вот при написание очередного такого творения столкнулся опять с затыком, который все-таки решил победить, а именно как одним запросом проверять есть ли товар в базе, если есть, то обновляем, если нет, то добавляем. В данном случае REPLACE не канает вообще, т к он при обновлении те ячейки, что трогать не надо, затирает нафиг. Делать в два запроса 1- проверка на наличие товара, 2 – добавляем/изменяем – это полный изврат, mysql.com ждет нас.

Курение манов на mysql.com привели к положительному результату уже на 15 минуте борьбы, все до отупения просто – нам поможет ON DUPLICATE KEY.

Итак приступим…

Дано:

Некая произвольная таблица с товарами

CREATE TABLE IF NOT EXISTS `tCatalogueGoods` (
`goodId` bigint(20) unsigned NOT NULL auto_increment,
`levelId` bigint(20) unsigned default ‘0’,
`goodName` varchar(255) default NULL,
`goodDescription` text,
`goodPrice` decimal(10,2) unsigned default ‘0.00’,
`goodCode` varchar(255) NOT NULL default ”,
PRIMARY KEY (`goodId`),
UNIQUE KEY `goodCode` (`goodCode`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

goodCode – в данном случае артикул товара, поле уникальное, по нему и будем обновлять.

INSERT INTO `s1_tCatalogueGood` (`goodId`, `levelId`, `goodName`, `goodDescription`, `goodPrice`, `goodCode`,) VALUES
(1, 1, ‘товар1′, ‘описание товар1′, 10.00, ‘8’),
(2, 2, ‘товар2′, ‘описание товар2′, 11.00, ‘9’),
(3, 1 , ‘товар3′, ‘описание товар3′, 12.00, ’10’);

Далее самое вкусное, само решение:

INSERT INTO `tCatalogueGood` (goodCode, goodPrice) VALUES (‘8′, 120)
ON DUPLICATE KEY UPDATE goodPrice=120

Что происходит? Мускул если не находит совпадение по уникальному полю goodCode, тогда добавляет новую запись, если находит, то обновляет нужную ячейку в записи.

В общем вот так довольно просто решил давнюю проблему.

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Categories: Новости Tags:
  1. Lex
    24 Ноябрь 2010 в 16:12 | #1

    А у меня вот другая задача с такой же проблемой:
    Надо вставить в табличку несколько записей, но если там уже есть записи с такими же PRIMARY KEYs то надо у существующих записей обновить некие значения.
    Как то так:
    INSERT INTO table (a,b) VALUES (1,5),(2,6) ON DUPLICATE KEY UPDATE b=5
    Здесь “а” PRIMARY KEY и надо чтобы для второй пары (2,6) тоже мог сделаться UPDATE, но не b=5, а b=6.

  2. Lex
    25 Ноябрь 2010 в 13:26 | #2

    Уже нашел. Надо было официальные доки читать а не упрощенные русифицированные на phpclub.ru.
    VALUES(b) – вот че надо было!

    INSERT INTO table (a,b) VALUES (1,5),(2,6) ON DUPLICATE KEY UPDATE b=VALUES(b)

  3. admin
    25 Ноябрь 2010 в 13:31 | #3

    @Lex
    отлично, на карандаш

*