PostgreSQL中如何将查询结果存入变量并用于INSERT语句?
PostgreSQL 父子表迁移:获取父表主键插入子表
针对你的需求,以下是两种符合PostgreSQL语法的实现方式:
方案1:插入父表时直接返回主键并插入子表(推荐)
这种方式无需额外查询父表,通过RETURNING子句直接获取新插入行的主键,再链式插入子表,原子性更强,还能避免并发场景下的查询错误:
WITH inserted_country AS ( INSERT INTO Countries (description) VALUES('asdf') RETURNING id ) INSERT INTO Cities (country_code_id, city_id, description) SELECT id, 1, 'abc' FROM inserted_country;
方案2:查询已存在的父表数据获取主键
如果父表数据已经插入,需要通过条件筛选获取主键,可以用PL/pgSQL的变量来实现(比如在DO块中执行):
DO $$ DECLARE countrid INT; BEGIN -- 从父表查询符合条件的主键值存入变量 SELECT id INTO countrid FROM Countries WHERE description = 'asdf'; -- 使用变量填充外键插入子表 INSERT INTO Cities (country_code_id, city_id, description) VALUES (countrid, 1, 'abc'); END $$;
原代码的问题说明
- PostgreSQL不支持
@countrid = SELECT ...这种SQL Server风格的变量赋值,必须使用PL/pgSQL的DECLARE声明变量,再通过SELECT INTO完成赋值。 - 插入子表时建议显式指定列名,避免后续表结构变更导致插入字段不匹配的问题。
内容的提问来源于stack exchange,提问作者Naveen Pandia
相关产品推荐
相关产品推荐

