You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL实现多表批量插入行数统计(替代@@ROW_COUNT)

PostgreSQL 多表批量插入的行数统计实现

在PostgreSQL中没有SQL Server那样的@@ROW_COUNT全局变量,但可以通过GET DIAGNOSTICS命令或者RETURNING子句配合统计函数来实现批量插入时的行数统计。以下是完整的脚本实现方案:

核心实现思路

  1. 声明整数变量存储各表的插入行数;
  2. 每次执行INSERT语句后,立即获取本次操作影响的行数并赋值给对应变量;
  3. 最后汇总或单独输出各表的统计结果。

完整脚本示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:25:06