PostgreSQL函数中使用ROW_COUNT时报错‘column "row_count" does not exist’的问题咨询
解决PostgreSQL中
ROW_COUNT不存在的错误 嘿,这个问题我熟!你碰到的报错,根源在于PostgreSQL并不支持ROW_COUNT这个全局变量/函数——这个语法是MySQL特有的,直接搬到PostgreSQL里当然会报错啦。在PostgreSQL的PL/pgSQL函数中,我们得用两种专属方式来获取最近一次数据修改操作影响的行数:
方式1:直接用SQL%ROWCOUNT属性
在PL/pgSQL里,每次执行UPDATE/INSERT/DELETE这类修改语句后,都可以通过SQL%ROWCOUNT直接获取受影响的行数。你只需要把原来的ROW_COUNT替换成这个就行:
修改后的代码示例:
-- 先执行你的更新操作(替换成你实际的UPDATE语句) UPDATE your_target_table SET your_column = new_value WHERE your_condition; -- 打印更新行数 RAISE NOTICE 'updated rows= %', SQL%ROWCOUNT; COMMIT; -- 注意:COMMIT本身不会改变SQL%ROWCOUNT的值,只要之后没执行新的修改语句,它依然保留最后一次修改的行数 RAISE NOTICE 'updated rows after commit= %', SQL%ROWCOUNT; COMMIT; END;
SQL%ROWCOUNT是PL/pgSQL的内置属性,专门用来记录最近一次执行的SQL语句影响的行数,必须在修改语句之后、未执行其他SQL操作之前使用才有效。
方式2:用GET DIAGNOSTICS存储行数到变量
如果需要把行数存下来反复使用,推荐用GET DIAGNOSTICS命令把数值存入变量,这样哪怕后续执行了其他操作,变量里的数值也不会丢失:
DECLARE affected_rows integer; -- 声明一个变量存储行数 BEGIN -- 执行你的更新操作 UPDATE your_target_table SET your_column = new_value WHERE your_condition; -- 将受影响行数存入变量 GET DIAGNOSTICS affected_rows = ROW_COUNT; -- 打印行数 RAISE NOTICE 'updated rows= %', affected_rows; COMMIT; -- commit后依然可以用变量打印 RAISE NOTICE 'updated rows after commit= %', affected_rows; COMMIT; END;
这种方式更灵活,适合需要多次引用行数的场景。
再啰嗦一句错误原因
PostgreSQL和MySQL虽然都是关系型数据库,但语法细节差异不小。ROW_COUNT()是MySQL用来获取受影响行数的函数,而PostgreSQL没有对应的全局函数,只能通过上面两种PL/pgSQL专属的方式来实现。
内容的提问来源于stack exchange,提问作者dros




