PostgreSQL:NOT VALID 约束与验证触发器

问题描述 投票:0回答:1

我有一个带有“货币”列的表。 我想阻止进一步插入某些货币,而不删除现有货币。

最初我正在考虑验证触发器。

然后我发现了

NOT VALID
ALTER TABLE ADD CONSTRAINT
选项,它阻止了现有数据的验证。

文档似乎暗示

NOT VALID
选项主要是出于性能原因,允许用户将验证推迟到以后。但没有明确指出它不能用于保留旧(无效)数据。

这篇文章中,那家伙说:“您甚至可以将约束保留在

NOT VALID
状态,因为这更好地反映了它的实际作用:检查新行,但不对现有数据提供任何保证。没有什么
NOT VALID
检查约束错误。

那么,

NOT VALID
选项可以用于此目的吗?或者制作一个验证触发器会更好吗?

postgresql database-design constraints database-trigger
1个回答
13
投票

引用遗漏的部分是:

https://www.postgresql.org/docs/current/sql-altertable.html

“约束仍将针对后续插入或更新强制执行(也就是说,除非引用的表中存在匹配的行(在外键的情况下),否则它们将失败,或者除非新行与指定检查条件)。

因此,如果有人再次更新旧行,则将应用约束。

NOT VALID

 只是随着时间的推移分散验证的一种方法。如果您想在列上维护多个验证状态,您将需要一个触发器来根据您选择的任何标准来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.