ВСТАВИТЬ ВНУТРЬ. При обновлении дубликата ключа для нескольких элементов
Я хочу сделать что-то подобное
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 ответа:
используйте функцию 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)
надеюсь, что это поможет кому-то там, кто хочет выполнить массовую вставку с несколькими повторяющимися обновлениями ключа. Синтаксис ускользнул от меня.