postgresql 始终生成为使用gen_random_uuid存储的(生成表达式)

jq6vz3qz  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)

希望创建如下所示的表:

CREATE TABLE newtable (
    id UUID  GENERATED ALWAYS AS gen_random_uuid() STORED,
    org uuid NOT NULL,
    name text,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    UNIQUE(name, org)
)

但我得到一个错误:

Query 1 ERROR: ERROR:  syntax error at or near "gen_random_uuid"
LINE 2:     id UUID  GENERATED ALWAYS AS gen_random_uuid() STORED

Postgres文档here(generated columns)here (table creation)指出这应该是可能的:
GENERATED ALWAYS AS(generation_expr)STORED此子句将列创建为生成列。无法写入此列,读取时将返回指定表达式的结果。
关键字STORED是必需得,它表示将在写入时计算列并将其存储在磁盘上.
生成表达式可以引用表中的其他列,但不能引用其他生成的列。使用的任何函数和运算符都必须是不可变的。不允许引用其他表。
我遗漏了什么?gen_random_uuid不是一个生成表达式吗?它似乎符合所有条件。

eh57zj3b

eh57zj3b1#

***generation_expr***前后的括号不见了,但这只是语法上的问题,不能用生成的列来表示它。进一步阅读链接到的the documentation,你会发现:

  • 生成表达式只能使用不可变函数,不能使用子查询或以任何方式引用当前行以外的任何内容。

现在gen_random_uuid()肯定不是IMMUTABLE函数。
您有两个选项:

  • 使用列DEFAULT子句
  • 如果不希望用户能够覆盖列DEFAULT,请使用BEFORE INSERT触发器

相关问题