Это больше вопрос / ответ по SQL, чем по Go, поэтому возможные решения основаны на SQL.
Возможные решения:
(1) REPLACE INTO
REPLACE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Это перезапишет существующую запись.Работает с уникальными ограничениями.Однако, если найдена соответствующая запись, она будет удалена и, следовательно, может иметь нежелательное поведение.
(2) INSERT IGNORE
INSERT IGNORE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Это добавит, если запись не существует.Работает с уникальными ограничениями.
Из справочника:
Если вы используете модификатор IGNORE, ошибки, возникающие при выполнении оператора INSERT, игнорируются.Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дубликата ключа, и оператор прерывается.При IGNORE строка отбрасывается, и ошибки не возникает.Игнорируемые ошибки могут вместо этого генерировать предупреждения, хотя ошибки с дублирующим ключом - нет.
(3) INSERT ... ON DUPLICATE KEY UPDATE
INSERT INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
ON DUPLICATE KEY UPDATE
title = 'No Green Eggs and Ham';
Если при вставке происходит сбой значенийс ON DUPLICATE KEY
будет использоваться для создания оператора обновления.
Для создания резервной копии создайте таблицу истории (таблицу с той же структурой, но дополненную столбцами для получения даты изменения) и выполните INSERT ... SELECT
,Чтобы быть атомарным, вам, вероятно, нужно использовать транзакции с правильной стратегией блокировки - не знаете, как получить это право для MySQL.
Ссылка: