この問題を処理するかなり簡単な方法があります。行のタイムスタンプがいつ更新されるかを管理していると考えてみましょう。
まず、ご存じのとおり、テーブルには と のデフォルト設定のタイムスタンプ列が必要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')
willのAND NOT
句は、実際に新しい値を提供するか提供しWHERE
ない限り、更新が行われないようにします。これが機能するのは、更新の句に一致する行がないためです。'newval1'
'newval2'
WHERE
更新が行われない場合、自動的に設定されたts
列は変更されません。changed_by
列が現在のユーザーの に設定されることもありませんuser_id
。したがって、最新の本物の変更の時間とユーザーがいます。
また、MySQL への多くのホスト言語インターフェイスには、最近のUPDATE
操作によって影響を受けた行数を判断するためのメソッド呼び出しがあります。この手法を使用すると、行が更新されていない場合、ゼロ行が返されます。これは、ユーザー インターフェイスにとって便利な場合があります。
また、この手法では単一のクエリが使用されるため、複数のユーザーが同時に同じ行を更新しようとしても安全です。それを保証するためにトランザクションを使用する必要はありません。
(ユーザーの追跡changed_by
はオプションであり、アプリケーションが現在のユーザーの実際の ID を提供できる場合にのみ機能することに注意してください。)
WHERE id = 'id_to_change'
これは、データベース検索が迅速に機能する限り、かなり効率的です。
アプリケーションの UPDATE クエリを作り直す必要があります。しかし、この問題に対する他のアプローチも同様です。