Атомарное обновление и резервное копирование ON DUPLICATE KEY вставьте еще - выражение golang sql - PullRequest
0 голосов
/ 20 ноября 2018

Каков наилучший способ объединить два оператора (INSERT или (BACKUP и UPDATE)) и выполнить их атомарно в golang?

Я нашел этот похожий вопрос: https://codereview.stackexchange.com/questions/186909/query-select-and-insert-if-not-exists?newreg=067063956a834327883542c3171a22d4

НоРешение не отвечает 2 из следующих требований:

  1. выполнить резервное копирование значения ON DUPLICATE KEY,
  2. использовать стандартный SQL
  3. не использоватьхранимые процедуры, но
  4. остаются атомарными.

1 Ответ

0 голосов
/ 20 ноября 2018

Это больше вопрос / ответ по 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.

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...