Есть ли способ использовать дубликат ключа для обновления всего, что я хотел вставить?


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

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

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

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

4 60

4 ответа:

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

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

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 Это то, что если новая запись представляет новые значения ключей, то она будет вставлена как новая запись.

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

если это полезно, я сделал запрос, чтобы избежать написания вручную последней части запроса" on duplicate", для версий >= 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)

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

SET SESSION group_concat_max_len = 1000000;

Я знаю, что это старый вопрос, и это несколько нетрадиционный ответ, но я столкнулся с тем же самым и имел проблемы с установкой свойства group_concat_max_len, упомянутого в другом ответе, и всегда получал усеченный результат. Другой вариант, с которым я в конечном итоге пошел при написании длинного сценария, состоял в том, чтобы использовать эту формулу в excel:

=SUBSTITUTE(TRIM(A1), ",", "") & " = VALUES(" & SUBSTITUTE(TRIM(A1), ",", "") & "),"

где A1-ячейка, в которую копируется имя поля. Чтобы сделать это быстро, я бы щелкнул Правой Кнопкой Мыши таблицу и скопировал выберите оператор в буфер обмена, который дает вам все имена Колум, формула удаляет запятые.

надеюсь, это кому-то поможет!