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, тогда добавляет новую запись, если находит, то обновляет нужную ячейку в записи.
В общем вот так довольно просто решил давнюю проблему.
А у меня вот другая задача с такой же проблемой:
Надо вставить в табличку несколько записей, но если там уже есть записи с такими же 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.
Уже нашел. Надо было официальные доки читать а не упрощенные русифицированные на phpclub.ru.
VALUES(b) – вот че надо было!
INSERT INTO table (a,b) VALUES (1,5),(2,6) ON DUPLICATE KEY UPDATE b=VALUES(b)
@Lex
отлично, на карандаш