INSERT INTO .. ​​ON DUPLICATE KEY UPDATE для нескольких элементов - PullRequest
66 голосов
/ 16 января 2009

Я хочу сделать что-то подобное

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?), Но это будет много запросов, поэтому я действительно хочу избежать этого.

Ответы [ 2 ]

149 голосов
/ 16 января 2009

Используйте функцию 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

37 голосов
/ 29 января 2014

Слишком низкое количество повторений для комментариев, но я хотел добавить немного более сложный синтаксис, вдохновленный ответом @ ʞɔı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)

Надеюсь, что это поможет кому-то, желающему выполнить массовую вставку с многократным обновлением ключа. Синтаксис ускользнул от меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...