PostgreSQL中实现Oracle INSERT ALL类似的单请求批量插入方法
PostgreSQL 实现类似 Oracle INSERT ALL 的单请求多表插入
PostgreSQL没有提供和Oracle完全一致的INSERT ALL语法,但可以通过以下几种方式在单个请求里完成向多张表插入数据的操作,且无返回值:
1. 直接执行多条INSERT语句
最直观的方式是把多个INSERT语句用分号分隔,放在同一个请求中执行:
INSERT INTO mytable1 (empId, name, last_name) VALUES (expr1, expr2, expr_n); INSERT INTO mytable2 (empId, address) VALUES (o_expr1, o_expr2, o_expr_n);
这种方式完全对应你给出的Oracle示例场景,PostgreSQL支持在单个请求中执行多条DML语句,执行后不会返回结果集(满足无返回值需求)。
2. 基于查询结果的多表插入(对应Oracle INSERT ALL + SELECT)
如果需要从查询结果中获取数据批量插入到多张表,可以借助WITH公共表达式来复用数据源,避免重复查询:
WITH source_data AS ( -- 这里可以是任意查询,比如从现有表取数,或构造虚拟数据 SELECT expr1, expr2, expr_n, o_expr1, o_expr2 FROM some_table ) INSERT INTO mytable1 (empId, name, last_name) SELECT expr1, expr2, expr_n FROM source_data; INSERT INTO mytable2 (empId, address) SELECT o_expr1, o_expr2 FROM source_data;
如果是固定值的场景,也可以用VALUES构造虚拟数据源:
WITH source_data AS ( VALUES (expr1, expr2, expr_n, o_expr1, o_expr2) ) INSERT INTO mytable1 (empId, name, last_name) SELECT column1, column2, column3 FROM source_data; INSERT INTO mytable2 (empId, address) SELECT column4, column5 FROM source_data;
3. 带条件的多表插入(对应Oracle INSERT ALL WHEN)
如果需要实现类似Oracle中带条件的多表插入(比如WHEN 条件 THEN INTO ...),只需在每个INSERT的SELECT子句中添加WHERE过滤条件即可:
WITH source_data AS ( SELECT emp_id, name, last_name, address, dept_id FROM employees ) INSERT INTO mytable1 (empId, name, last_name) SELECT emp_id, name, last_name FROM source_data WHERE dept_id = 10; INSERT INTO mytable2 (empId, address) SELECT emp_id, address FROM source_data WHERE dept_id = 20;
内容的提问来源于stack exchange,提问作者Inessa
相关产品推荐
相关产品推荐

