Как добавить запись в таблицу, при этом если она уже есть, обновить ее или не трогать если нету обновления по полям

Вот такой код работает, что если uuid совпадает, то не трогать запись, а мне надо, если там значения полей поменялись, то обновить строку, как сделать?

    sql_insert = "INSERT INTO `table1` (`id`, `created_at`, `updated_at`, `username`, `project`, `vm_state`, `power_state`, `email`, `status_send`,
 `emaildate`, `host`, `vmname`, `uuid`, `statusremove`) VALUES (NULL, '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '0', NULL, '%s', '%s', '%s', '0')
 ON DUPLICATE KEY UPDATE `table1`.`uuid` = '%s' " % (r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9],r[9])

Ответы (1 шт):

Автор решения: Akina
INSERT INTO `table1` (`id`, `created_at`, `updated_at`, `username`, `project`, 
                      `vm_state`, `power_state`, `email`, `status_send`,
                      `emaildate`, `host`, `vmname`, `uuid`, `statusremove`) 
VALUES (NULL, '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '0', NULL, '%s', '%s', '%s', '0')
ON DUPLICATE KEY UPDATE 
created_at = VALUES(created_at),
updated_at = VALUES(updated_at),
...
vmname = VALUES(vmname),
statusremove = VALUES(statusremove);

Функция VALUES() возвращает то значение, которое было бы присвоено в секции INSERT, не встреться ошибки дублирования. Так что второй раз передавать те же значения не надо (а вот если надо присвоить иное значение - то надо).

Поля с автоприсвоением (автоинкремент, автообновляемый дата-время) обновлять в секции UPDATE не требуется.

Если какое-то поле получает в качестве значения литерал, а не параметр, то в секции UPDATE можно также использовать литерал. Например, последняя строка может быть statusremove = '0', потому что в списке VALUES вставляемых значений этому полю соответствует литерал '0'.

→ Ссылка