Отслеживание актуальных изменений в строках при обновлении таблицы

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

Мне нужен какой-то алгоритм может быть через MySQL (дБ) или иным образом (часть кода), так что позже я смогу определить, какие строки имеют измененное значение.

Есть столбец с измененной датой, который я изменяю. Но это не будет истинным показателем, поскольку он всегда будет обновляться. Я хочу способ, которым я могу определить, изменились ли значения некоторых предопределенных столбцов,

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

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

Я хочу знать лучшее решение.

1 ответ

Решение

Есть довольно простой способ справиться с этой проблемой. Давайте подумаем об этом, как об управлении, когда отметка времени строки обновляется.

Прежде всего, как я уверен, вы знаете, вашей таблице нужен столбец отметки времени с настройками по умолчанию для INSERT а также UPDATE, Это выглядит так, если столбец называется ts,

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Во-вторых, вы можете использовать такой запрос UPDATE, чтобы изменить значения в строке.

UPDATE stock
   SET val1 = 'newval1', 
       val2 = 'newval2', 
       changed_by = 'current_user_id'
 WHERE id = 'id_to_change'
   AND NOT (val1 == 'newval1' AND val2 == 'newval2')

AND NOT пункт о WHERE будет препятствовать обновлению, если 'newval1' или же 'newval2' будет на самом деле предоставить новые значения. Это работает, потому что ни одна строка не соответствует WHERE пункт в обновлении.

Когда обновление предотвращается, ваш автоматически установленный ts колонка не изменится. Ни один не будет changed_by столбец будет установлен для текущего пользователя user_id, Итак, у вас есть время и пользователь самых последних подлинных изменений.

Кроме того, многие интерфейсы языка хоста для MySQL имеют вызов метода, чтобы определить, сколько строк было затронуто недавним UPDATE операция. С помощью этой техники вы получите ноль строк, когда строка не будет обновлена. Это может быть удобно для вашего пользовательского интерфейса.

Кроме того, этот метод использует один запрос, поэтому безопасно, если несколько пользователей одновременно пытаются обновить одну и ту же строку. Там нет необходимости использовать транзакцию, чтобы гарантировать это.

(Обратите внимание, что отслеживание changed_by Пользователь не обязателен и будет работать только в том случае, если ваше приложение может предоставить текущий идентификатор текущего пользователя.)

Это достаточно эффективно, пока база данных ищет WHERE id = 'id_to_change' работает быстро

Это требует доработки запросов UPDATE вашего приложения. Но так же, как и любой другой подход к этой проблеме.

Другие вопросы по тегам