PostgreSQL:NOT VALID 约束与验证触发器
PostgreSQL : NOT VALID constraint vs validation trigger
我有一个带有“货币”列的 table。
我想阻止进一步插入某些货币,而不删除现有货币。
最初我想到的是验证触发器。
然后我发现了 ALTER TABLE ADD CONSTRAINT
的 NOT VALID
选项,它阻止了现有数据的验证。
The documentation 似乎暗示 NOT VALID
选项主要是出于性能原因,允许用户将验证推迟到以后。但是它没有明确说明它不能用于保留旧(无效)数据的目的。
在 this post 中,这个人说:“您甚至可以将约束保留在 NOT VALID
状态,因为这更好地反映了它的实际作用:检查新行,但不保证现有数据。NOT VALID
检查约束没有错。"
那么,NOT VALID
选项可以用于此目的吗?或者做一个验证触发器会更好吗?
引用遗漏的部分是:
https://www.postgresql.org/docs/current/sql-altertable.html
“该约束仍将针对后续的插入或更新强制执行(也就是说,它们将失败,除非在引用的 table 中存在匹配的行,对于外键,或者它们'除非新行符合指定的检查条件,否则将失败。"
因此,如果有人再次更新旧行,则会应用约束。 NOT VALID
只是一种随时间分散验证的方法。如果您想在列上维护多个验证状态,您将需要一个触发器来根据您 select.
的任何条件执行此操作
我有一个带有“货币”列的 table。 我想阻止进一步插入某些货币,而不删除现有货币。
最初我想到的是验证触发器。
然后我发现了 ALTER TABLE ADD CONSTRAINT
的 NOT VALID
选项,它阻止了现有数据的验证。
The documentation 似乎暗示 NOT VALID
选项主要是出于性能原因,允许用户将验证推迟到以后。但是它没有明确说明它不能用于保留旧(无效)数据的目的。
在 this post 中,这个人说:“您甚至可以将约束保留在 NOT VALID
状态,因为这更好地反映了它的实际作用:检查新行,但不保证现有数据。NOT VALID
检查约束没有错。"
那么,NOT VALID
选项可以用于此目的吗?或者做一个验证触发器会更好吗?
引用遗漏的部分是:
https://www.postgresql.org/docs/current/sql-altertable.html
“该约束仍将针对后续的插入或更新强制执行(也就是说,它们将失败,除非在引用的 table 中存在匹配的行,对于外键,或者它们'除非新行符合指定的检查条件,否则将失败。"
因此,如果有人再次更新旧行,则会应用约束。 NOT VALID
只是一种随时间分散验证的方法。如果您想在列上维护多个验证状态,您将需要一个触发器来根据您 select.