我有一种情况,如果当前 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
这似乎没有按预期工作。直觉上我可以看到这是一个问题。规划者如何知道左侧应该是新值而右侧应该是旧值?
知道这行不通,应该如何执行这个约束?