【发布时间】:2021-12-10 13:32:24
【问题描述】:
下面的 GENERATED 子句都无法在 psql 中编译,出现错误 42601
什么是正确的语法? (或者不支持 GENERATED NUMRANGE 吗?)
CREATE TABLE lh (
l NUMERIC,
h NUMERIC,
--lhr NUMRANGE GENERATED ALWAYS AS numrange(l,h) STORED
--lhr NUMRANGE GENERATED ALWAYS AS (l,h)::NUMRANGE STORED
--lhr NUMRANGE GENERATED ALWAYS AS '(l,h)'::NUMRANGE STORED
--lhr NUMRANGE GENERATED ALWAYS AS (l::NUMERIC,h:NUMERIC) STORED
lhr NUMRANGE GENERATED ALWAYS AS (l::NUMERIC,h:NUMERIC)::NUMRANGE STORED
);
【问题讨论】:
-
意图是在 DDL 中定位一次写入逻辑
-
问题是定义
numrange不会强制执行一次写入逻辑。您不能更新生成的列是正确的,但是更新它所基于的列会导致 Postgres 重新生成它。见demo。强制只写一次需要一个触发器。 -
是的,谢谢,明白这一点,但在驱动应用程序的业务规则中,h & l 永远不会改变
标签: postgresql ddl