PostgreSQL脚本复用RETURNING返回值查询报错解决方法
报错根因
两个问题直接导致执行失败:
INSERT ... RETURNING语法仅会将结果返回给客户端,不会在会话中自动创建可跨语句引用的变量,后续语句直接写org_id时,数据库无法识别该值的来源,直接抛出列不存在的错误。- 语句中字符串值误用了双引号:PostgreSQL中双引号仅用于包裹标识符(表名、列名等),字符串常量必须使用单引号包裹,就算解决变量引用问题,双引号写法也会触发标识符不存在的报错。
可直接使用的修复方案
以下两种写法都兼容Docker初始化SQL脚本的执行逻辑,直接替换原有SQL即可:
方案1:CTE联级写入(单语句完成,最简洁)
通过公共表表达式接住第一条INSERT返回的org_id,直接关联插入后续的实体数据,不需要额外定义变量,适合固定逻辑的初始化场景:
WITH create_org AS ( INSERT INTO ORG_ORGANISATION (NAME, DISPLAY_NAME, DESCRIPTION ) VALUES('TestOrg', 'Green Tech Services', 'An organization committed to measure GHG emissions and reduce GHG emissions') RETURNING org_id ) INSERT INTO ORG_ENTITY(ORG_ID, PARENT_ENTITY_ID, NAME, DISPLAY_NAME, DESCRIPTION) SELECT create_org.org_id, create_org.org_id, region_info.name, region_info.display_name, region_info.description FROM create_org, (VALUES ('Asia Pacific Region', 'APAC', 'Region of APAC'), ('Region of Europe, Middle East and Africa', 'EMEA', 'Region of EMEA'), ('Region of Americas', 'AMERICAS', 'Region of AMERICAS') ) AS region_info(name, display_name, description);
*注:上述代码已修正原SQL中Regiion的拼写错误。
方案2:PL/pgSQL变量存储(适合多语句复用ID的场景)
如果后续还有更多表需要关联插入这个org_id,可以用匿名块定义本地变量接住返回值,后续所有语句都可以直接引用该变量:
DO $$ DECLARE -- 变量类型请和ORG_ORGANISATION表中org_id的实际字段类型保持一致 current_org_id integer; BEGIN INSERT INTO ORG_ORGANISATION (NAME, DISPLAY_NAME, DESCRIPTION ) VALUES('TestOrg', 'Green Tech Services', 'An organization committed to measure GHG emissions and reduce GHG emissions') RETURNING org_id INTO current_org_id; INSERT INTO ORG_ENTITY(ORG_ID, PARENT_ENTITY_ID, NAME, DISPLAY_NAME, DESCRIPTION) VALUES (current_org_id, current_org_id, 'Asia Pacific Region', 'APAC', 'Region of APAC'), (current_org_id, current_org_id, 'Region of Europe, Middle East and Africa', 'EMEA', 'Region of EMEA'), (current_org_id, current_org_id, 'Region of Americas', 'AMERICAS', 'Region of AMERICAS'); END $$;
补充说明
Docker官方PostgreSQL镜像的初始化脚本会按文件名顺序执行/docker-entrypoint-initdb.d/目录下的所有.sql文件,上述两种写法都是PostgreSQL原生支持的语法,不需要额外安装扩展或修改容器配置,直接放入挂载的SQL文件即可正常运行。
内容的提问来源于stack exchange,提问作者Sankeerthan Kasilingam
相关产品推荐
相关产品推荐

