現在の modified_at 列が更新で指定されたものよりも新しい場合、テーブルへの更新を拒否したい状況があります。CHECK 制約を使用してこれを実行しようとしましたが、効果がありません。
次に例を示します。
CREATE TABLE test (
id SERIAL PRIMARY KEY,
value INTEGER NOT NULL DEFAULT 0,
modified_at timestamptz DEFAULT NOW()
);
ALTER TABLE test ADD CHECK (modified_at >= modified_at);
INSERT INTO test (id, value) VALUES (1, 1);
INSERT 0 1
SELECT * FROM test;
id | value | modified_at
----+-------+-------------------------------
1 | 1 | 2013-05-30 14:34:37.234456-07
UPDATE test
SET value = 2, modified_at = NOW() - INTERVAL '1 day'
WHERE id = 1;
UPDATE 1
SELECT * FROM test;
id | value | modified_at
----+-------+-------------------------------
1 | 2 | 2013-05-29 14:35:41.337543-07
これは期待どおりに機能していないようです。直感的に、これが問題であることがわかりました。プランナーは、左側が新しい値で、右側が古い値であることをどのように認識しますか?
これが機能しないことを知っている場合、この制約をどのように強制する必要がありますか?