Есть ли способ использовать ON DUPLICATE KEY для обновления всего, что я хотел вставить?

Я знаю, что вы можете использовать ON DUPLICATE KEY UPDATE для обновления определенного значения, если уже есть запись для этого ключа,

Я могу это сделать:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3

Но как я могу это сделать без необходимости дважды записывать столбцы и значения?

Ответ 1

К сожалению, нет.

Вы можете получить на полпути, не повторяя значения:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);

Но вам все равно придется перечислять столбцы.

Ответ 2

использовать REPLACE INTO

Значение REPLACE INTO заключается в том, что если новая запись представляет новые значения ключа, то она будет вставлена ​​как новая запись.

Если новая запись имеет ключевые значения, соответствующие предыдущей записи, тогда нарушение ключа будет проигнорировано, а новая запись заменит ранее существовавшую запись.

Ответ 3

Если это полезно, я сделал запрос, чтобы избежать записи вручную последней части "дублированного" запроса для версий >= 5.0:

SELECT GROUP_CONCAT( CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

и его вывод следующий:

a=values(a), b=values(b), c=values(c), d=values(d)

в таблице с столбцами a, b, c и d, поэтому вы можете добавить в первую часть запроса:

INSERT INTO `tableName` (`a`,`b`,`c`, `d`) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE a=values(a), b=values(b), c=values(c), d=values(d)

UPDATE: Для очень длинного списка столбцов вы можете увидеть усеченный вывод, вы можете использовать этот оператор перед запросом выше (спасибо дядя Ирох):

SET SESSION group_concat_max_len = 1000000;