PostgreSQL : NOT VALID constraint vs validation trigger

标签 postgresql database-design constraints database-trigger

我有一个带有“货币”列的表格。
我想防止进一步插入某些货币,而不删除现有货币。
最初我在考虑验证触发器。
然后我发现了NOT VALID ALTER TABLE ADD CONSTRAINT 的选项,这会阻止验证现有数据。
The documentation似乎暗示NOT VALID选项主要是出于性能原因,以允许用户将验证推迟到以后。但没有明确说明它不能用于保留旧(无效)数据的目的。
this post ,这家伙说:“您甚至可以将约束保留在 NOT VALID 状态,因为这更好地反射(reflect)了它的实际作用:检查新行,但不对现有数据提供任何保证。NOT VALID 检查没有任何问题约束。”
那么,可以NOT VALID选项可用于此目的?或者做一个验证触发器会更好吗?

最佳答案

引用遗漏的部分是这样的:
https://www.postgresql.org/docs/current/sql-altertable.html
“约束仍将针对后续插入或更新强制执行(也就是说,除非引用表中有匹配的行,否则它们将失败,在外键的情况下,或者除非新行与指定的行匹配,否则它们将失败检查条件)。”
因此,如果有人再次更新旧行,则将应用约束。 NOT VALID只是随着时间的推移传播验证的一种方式。如果您想在列上维护多个验证状态,您将需要一个触发器来根据您选择的任何条件执行此操作。

关于PostgreSQL : NOT VALID constraint vs validation trigger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62968292/

相关文章:

postgresql - 由于docker上的权限被拒绝而无法创建postgres用户

mysql - Heroku 为什么使用 Postgresql?

mysql - 为什么第二次运行 MySQL 查询速度更快?

sql - PostgreSQL - 基于另一个表中的列的约束

ios - 自动布局约束何时解决?

ios - 我需要未知元素的最高约束

postgresql - 使用 go 和 sqlc 库创建 api 时,我在 postgresql 中的数据会自动加密

sql - 如何合并以下 SQL 查询以提高性能?

mysql - 在 MySQL 中设计分层架构

sql-server - 数据库触发器