Да, запрос этого шаблона будет работать, но весьма необычно, что мы будем обновлять столбцы a
или b
, которые являются частью УНИКАЛЬНОГО КЛЮЧА.
Когда попытка INSERT не удалась из-за нарушение уникального ограничения, часть ON DUPLICATE KEY вызывает операцию UPDATE для существующей строки.
Учитывая, что PRIMARY KEY (или UNIQUE KEY) таблицы 2 является кортежем (a,b,c)
, мы обычно только хотите обновить столбцы, отличные от a, b и c.
Примерно так:
INSERT INTO table2 (a, b, c, d)
SELECT s.a
, s.b
, s.c
, s.d
FROM table1 s
WHERE s.id <> 0
ON DUPLICATE KEY
UPDATE d = VALUES(d)
Это шаблон, который выполняет ожидаемые нами операции, как описано в MySQL Справочное руководство.
Если UNIQUE KEY задан как набор из трех столбцов (a, b, c), то ключ ON DUPLICATE не будет выполняться на основе значения "один столбец". ». Это срабатывает только в случае неудачной попытки выполнить INSERT с нарушением уникального ключа.
(Вопрос не в том, чтобы дать спецификацию, фактическое описание того, что является «желаемым результатом»). Поскольку вопрос поставлен, мы не можем дать никаких предложений о том, как достичь желаемого результата, мы бы только догадались.)