一尘不染

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

sql

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

一个示例是NULL时间戳,指示发生了某些事情,例如“ file_exported”。一旦文件已导出并且具有非NULL值,则永远不要再次将其设置为NULL。

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

如果有帮助,我正在使用postgresql,但我想查看适合任何SQL实现的解决方案


阅读 148

收藏
2021-05-23

共1个答案

一尘不染

一个示例是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
)

命中计数器类似地是不同的表:

CREATE TABLE thing_hits(
    thing_id INTEGER NOT NULL REFERENCES(thing.id),
    hit_date TIMESTAMP NOT NULL,
    PRIMARY KEY (thing_id, hit_date)
)

您可能会查询

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
2021-05-23