Ответ 1
Используйте функцию VALUES()
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)
см. http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Я хочу сделать что-то вроде этого
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value')
ON DUPLICATE KEY UPDATE
t.c = 'value';
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = 'value2';
t.a и t.b - это ключи. Все это работает отлично, но я получаю ошибку во второй вставке. С phpMyAdmin такой запрос отлично работает, но я предполагаю, что он запускает запросы независимо, поскольку он выводит результаты из этого запроса в виде комментариев?
Что-то вроде этого тоже будет хорошо, но мне нужно будет иметь разные значения для каждого элемента. Я предпочитаю это, но я не уверен, как я могу изменить значение для обновления для каждого значения.
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = ???
Проблема в вопросительных знаках, что я должен там положить, чтобы каждая вставка/обновление имела правильное значение? Очевидно, если я поместил туда значение, все поля получат это значение.
Если есть другой способ выполнить "обновление, если существует, иначе вставьте" запрос на несколько полей с двумя ключами, я тоже задумаюсь над другими идеями. Думаю, я мог бы выполнять каждый запрос отдельно (например, phpMyAdmin?), Но это будет много запросов, поэтому я действительно хочу этого избежать.
Используйте функцию VALUES()
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)
см. http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Слишком низкая репутация для комментариев, но я хотел добавить немного более сложный синтаксис, который был вдохновлен ответом @ʞɔıu. Чтобы обновить несколько полей на дублированном ключе:
INSERT INTO t (t.a, t.b, t.c, t.d)
VALUES ('key1','key2','value','valueb'), ('key1','key3','value2','value2b')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c),
t.d = VALUES(t.d)
Надеюсь, что кто-то там захочет выполнять массовую вставку с несколькими повторными обновлениями ключей. Синтаксис ускользнул от меня.