SQL约束以防止基于其先前值更新列

and*_*ieb 5 sql postgresql check-constraints

可以使用检查约束(或其他一些技术)来防止在更新记录时设置的值与其先前值相矛盾.

一个例子是NULL时间戳,表示发生了什么,比如"file_exported".导出文件并具有非NULL值后,永远不应再将其设置为NULL.

另一个例子是命中计数器,其中只允许整数增加,但永远不会减少.

如果它有助于我使用postgresql,但我希望看到适合任何SQL实现的解决方案

Cra*_*ger 7

使用触发器.对于简单的PL/PgSQL ON UPDATE ... FOR EACH ROW触发器来说,这是一个完美的工作,它可以同时看到NEWOLD值.

请参阅触发程序.


Sin*_*ion 2

一个例子是 NULL 时间戳,表明发生了某些事情,例如“file_exported”。一旦文件被导出并且具有非 NULL 值,就不应再将其设置为 NULL。

另一个例子是命中计数器,其中整数只允许增加,但永远不能减少。

在这两种情况下,我根本不会将这些更改记录为带注释的表上的属性;“导出”或“命中计数”是一个独特的概念,代表与它们相关的对象的相关但正交的现实世界概念:

所以他们只是不同的关系。因为我们只希望“file_exported”出现一次:

CREATE TABLE thing_file_exported(
    thing_id INTEGER PRIMARY KEY REFERENCES(thing.id),
    file_name VARCHAR NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

命中计数器同样是一个不同的表:

CREATE TABLE thing_hits(
    thing_id INTEGER NOT NULL REFERENCES(thing.id),
    hit_date TIMESTAMP NOT NULL,
    PRIMARY KEY (thing_id, hit_date)
)
Run Code Online (Sandbox Code Playgroud)

你可能会查询

SELECT thing.col1, thing.col2, tfe.file_name, count(th.thing_id)
FROM thing 
LEFT OUTER JOIN thing_file_exported tfe
    ON (thing.id = tfe.thing_id)
LEFT OUTER JOIN thing_hits th
    ON (thing.id = th.thing_id)
GROUP BY thing.col1, thing.col2, tfe.file_name
Run Code Online (Sandbox Code Playgroud)