PostgreSQL创建含GENERATED ALWAYS AS列报错:gen_random_uuid语法问题
PostgreSQL 12中GENERATED列使用gen_random_uuid()报错的原因及解决方法
你的问题出在两个层面,核心是生成列的规则限制:
1. 函数稳定性不符合生成列要求
PostgreSQL的生成列要求表达式必须使用**不可变(IMMUTABLE)函数——这类函数的定义是相同输入永远返回相同输出。但gen_random_uuid()属于稳定(STABLE)**函数:它没有输入参数,但每次调用都会生成不同的UUID,完全不满足不可变函数的要求,因此不能作为生成列的表达式。
2. 语法细节遗漏
即使函数符合要求,你的写法也缺少了表达式的括号包裹,生成列的标准语法要求表达式必须放在()内,即GENERATED ALWAYS AS (表达式) STORED。不过这只是表层语法问题,就算补上括号,依然会因为函数稳定性不达标报错。
正确的实现方式
如果你的需求是自动生成UUID作为标识符,应该使用DEFAULT约束而非生成列,这才是PostgreSQL中自动生成UUID的标准用法:
CREATE TABLE newtable ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), org uuid NOT NULL, name text, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE(name, org) );
生成列的设计初衷是存储基于表中其他列计算出的派生值(比如full_name GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED),而自动生成的独立标识符更适合用默认值来实现。
内容的提问来源于stack exchange,提问作者matic
相关产品推荐
相关产品推荐

