Ответ 1
Вы можете получить на полпути, не повторяя значения:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);
Но вам все равно придется перечислять столбцы.
Я знаю, что вы можете использовать ON DUPLICATE KEY UPDATE
для обновления определенного значения, если уже есть запись для этого ключа,
Я могу это сделать:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3
Но как я могу это сделать без необходимости дважды записывать столбцы и значения?
Вы можете получить на полпути, не повторяя значения:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);
Но вам все равно придется перечислять столбцы.
использовать REPLACE INTO
Значение REPLACE INTO
заключается в том, что если новая запись представляет новые значения ключа, то она будет вставлена как новая запись.
Если новая запись имеет ключевые значения, соответствующие предыдущей записи, тогда нарушение ключа будет проигнорировано, а новая запись заменит ранее существовавшую запись.
Если это полезно, я сделал запрос, чтобы избежать записи вручную последней части "дублированного" запроса для версий >= 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;