1

コード内の他のソースの値から、更新し続けるテーブルがあります。更新する値は、既に行にある値と同じである場合と異なる場合があります。

後でどの行の値が変更されたかを特定できるように、mysql(db)またはその他(コードの一部)を介した何らかのアルゴリズムが必要です。

私が変更した変更日欄があります。ただし、常に更新されるため、これは真の指標ではありません。一部の事前定義された列の値が変更されたかどうかを判断できる方法が必要です。

1 つの解決策は次のとおりです。選択クエリを実行してから、テーブル内の変更されたフラグを比較および更新できます。しかし、それは複雑に思え、私には多くのレコードを持つテーブルがあるので、私にとってはそうではありません

別の解決策は、値の md5 チェックサムを列に保存し、更新中に以前の md5 と現在の md5 などを比較することです。

最適解が知りたいです。

4

1 に答える 1

0

この問題を処理するかなり簡単な方法があります。行のタイムスタンプがいつ更新されるかを管理していると考えてみましょう。

まず、ご存じのとおり、テーブルには と のデフォルト設定のタイムスタンプ列が必要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 クエリを作り直す必要があります。しかし、この問題に対する他のアプローチも同様です。

于 2015-02-07T14:20:41.183 に答える