2

H2 データベース テーブル T でトランザクションを実行する 2 つのプロセス A と B があるとします。

プロセス A は、T に対して CRUD (作成、読み取り、更新、削除) を実行します。

プロセス B は、T の行 L がいつ最後に変更されたかを知りたがっています (つまり、B はSystem.currentTimeMillis()たとえば値を提供します)。

各行の最後の変更の瞬間を登録する列を T に作成することもできますが、H2 が既にこの情報をどこかに保持しているかどうか、およびアクセスできるかどうか疑問に思っていました。

4

2 に答える 2

2

私の知る限り、H2にはそのような機能はありません(おそらくどのRDBMSにもありません)。理由は単純です。各レコードごとに4バイトまたは8バイトを追加すると、特に小さなレコードの場合、データベース全体のサイズに大きな影響を与える可能性があります。また、パフォーマンスにわずかな影響があります。

ただし、追加の列と更新トリガーを使用してこの機能を実装するのは比較的簡単です。また、MySQLのように、一部のデータベースはそれをさらに単純化する可能性があります。

ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP

また、データベースサーバーのクロック、プロセスAのクロック、プロセスBのクロックを区別してください。現実の世界では、それらはおそらく同じではありません。

于 2011-05-26T19:07:02.953 に答える
1

データベースには、設定したものだけが保存されます。

そのため、変更時刻を格納するようにテーブルを設定する必要があります。これを行う簡単な方法の 1 つはnow()、レコードが変更されるたびに計算列が評価される値を持つ「計算列」を作成することです。

CREATE TABLE TEST(ID INT, NAME VARCHAR, LAST_MOD TIMESTAMP AS NOW());

参考までに: http://www.h2database.com/html/features.html#computed_columns

于 2014-02-25T20:17:01.127 に答える