PostgreSQL实现多表批量插入行数统计(替代@@ROW_COUNT)
PostgreSQL 多表批量插入的行数统计实现
在PostgreSQL中没有SQL Server那样的@@ROW_COUNT全局变量,但可以通过GET DIAGNOSTICS命令或者RETURNING子句配合统计函数来实现批量插入时的行数统计。以下是完整的脚本实现方案:
核心实现思路
- 声明整数变量存储各表的插入行数;
- 每次执行
INSERT语句后,立即获取本次操作影响的行数并赋值给对应变量; - 最后汇总或单独输出各表的统计结果。
完整脚本示例
DO $$ -- 声明统计变量,每个表对应一个变量,初始化为0 DECLARE cnt_users INTEGER := 0; cnt_orders INTEGER := 0; cnt_products INTEGER := 0; total_cnt INTEGER := 0; BEGIN -- 批量插入用户表 INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com'), ('bob', 'bob@example.com'), ('charlie', 'charlie@example.com'); -- 获取本次插入的行数 GET DIAGNOSTICS cnt_users = ROW_COUNT; -- 批量插入订单表 INSERT INTO orders (user_id, order_date, total_amount) VALUES (1, '2024-05-01', 99.99), (2, '2024-05-02', 150.50); GET DIAGNOSTICS cnt_orders = ROW_COUNT; -- 从临时表批量导入产品数据 INSERT INTO products (name, price, stock) SELECT product_name, price, stock FROM temp_product_import WHERE is_valid = TRUE; GET DIAGNOSTICS cnt_products = ROW_COUNT; -- 计算总行数 total_cnt := cnt_users + cnt_orders + cnt_products; -- 输出统计结果(可根据需求替换为写入日志表等操作) RAISE NOTICE '插入统计详情:'; RAISE NOTICE '用户表:% 行', cnt_users; RAISE NOTICE '订单表:% 行', cnt_orders; RAISE NOTICE '产品表:% 行', cnt_products; RAISE NOTICE '总计插入:% 行', total_cnt; END; $$ LANGUAGE plpgsql;
关键细节说明
GET DIAGNOSTICS 变量名 = ROW_COUNT:该命令会获取最近一次执行的SQL语句影响的行数,无论是直接VALUES插入还是从查询结果导入,都能准确返回实际插入的行数;- 如果不需要单独统计每个表,可直接累加行数:
DO $$ DECLARE total_rows INTEGER := 0; BEGIN INSERT INTO users (...) VALUES (...); GET DIAGNOSTICS total_rows = total_rows + ROW_COUNT; INSERT INTO orders (...) VALUES (...); GET DIAGNOSTICS total_rows = total_rows + ROW_COUNT; RAISE NOTICE '总计插入 % 行', total_rows; END; $$ LANGUAGE plpgsql; - 若需要同时获取插入的数据并统计,可使用
RETURNING子句配合COUNT:
这种方式适合需要对插入数据做额外处理的场景,单纯统计行数的话DO $$ DECLARE cnt_users INTEGER; BEGIN WITH inserted AS ( INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com'), ('bob', 'bob@example.com') RETURNING 1 ) SELECT COUNT(*) INTO cnt_users FROM inserted; RAISE NOTICE '用户表插入 % 行', cnt_users; END; $$ LANGUAGE plpgsql;GET DIAGNOSTICS更简洁高效。
内容的提问来源于stack exchange,提问作者Darío Kozicki
相关产品推荐
相关产品推荐

