如何在PostgreSQL脚本中存储生成ID用于多表插入操作
在PostgreSQL脚本中存储父表插入返回的ID用于子表插入
当然可以,有两种常用方案适配你的场景:
方案1:使用WITH子句(单事务原子操作)
把父表插入和所有子表插入放在同一个WITH语句中,确保操作原子性,适合一次性完成父子表数据插入的场景:
WITH inserted_parent AS ( INSERT INTO parent_table (...) VALUES (...) -- 替换为你的父表插入值 RETURNING id ) -- 第一条子表插入 INSERT INTO child_table (parent_id, col1, col2) SELECT id, 'val1', 'val2' FROM inserted_parent; -- 第二条子表插入 INSERT INTO child_table (parent_id, col1, col2) SELECT id, 'val3', 'val4' FROM inserted_parent; -- 第三条子表插入 INSERT INTO child_table (parent_id, col1, col2) SELECT id, 'val5', 'val6' FROM inserted_parent;
如果子表的批量插入逻辑可以合并,也可以用UNION ALL简化成单条INSERT语句,减少语句执行开销。
方案2:使用psql/pgcli变量(脚本内复用ID)
利用psql的\gset命令捕获父表插入返回的ID,将其存储为会话变量,后续子表插入直接引用即可,适合脚本中需要多次复用该ID的场景:
-- 插入父表并将返回的id存储为:parent_id变量 INSERT INTO parent_table (...) VALUES (...) RETURNING id \gset parent_ -- 直接引用变量插入子表 INSERT INTO child_table (parent_id, ...) VALUES (:parent_id, 'xxx', 'yyy'); INSERT INTO child_table (parent_id, ...) VALUES (:parent_id, 'aaa', 'bbb'); INSERT INTO child_table (parent_id, ...) VALUES (:parent_id, 'ccc', 'ddd');
\gset parent_会把返回结果中的列名(这里是id)拼接前缀parent_,生成变量:parent_id,pgcli同样支持该语法。
内容的提问来源于stack exchange,提问作者Achim
相关产品推荐
相关产品推荐

