获取 PostgreSQL 中受 INSERT 或 UPDATE 影响的记录计数

我的 PostgreSQL 8/9数据库驱动程序在执行 INSERTUPDATE时不返回受影响的记录计数。

PostgreSQL 提供了非标准语法“ 返回”,这似乎是一个不错的解决方案。但是语法是什么呢?该示例返回记录的 ID,但我需要一个计数。

插入分发服务器(did,dname)值(默认值,‘ XYZ Widgets’) 返回做强;

98375 次浏览

我同意米伦,你的司机应该为你这样做。您使用什么驱动程序,使用什么语言?但是如果使用 plpgsql,则可以使用 GET DIAGNOSTICS my_var = ROW_COUNT;

Http://www.postgresql.org/docs/current/static/plpgsql-statements.html#plpgsql-statements-diagnostics

我知道这个问题很难回答,我的解决方案可以说过于复杂,但这是我最喜欢的解决方案!

不管怎样,我必须做同样的事情,让它像这样工作:

-- Get count from INSERT
WITH rows AS (
INSERT INTO distributors
(did, dname)
VALUES
(DEFAULT, 'XYZ Widgets'),
(DEFAULT, 'ABC Widgets')
RETURNING 1
)
SELECT count(*) FROM rows;


-- Get count from UPDATE
WITH rows AS (
UPDATE distributors
SET dname = 'JKL Widgets'
WHERE did <= 10
RETURNING 1
)
SELECT count(*) FROM rows;

总有一天,我真的要抽出时间为 PostgreSQL 的 WITH 子句写一首爱的十四行诗... ..。

从你的问题来看,还不清楚你怎么称呼这份声明。假设您正在使用类似 JDBC 的东西,您可能将其作为查询而不是更新来调用。来自 JDBC 的 executeQuery:

执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

因此,当执行返回某些查询结果(如 SELECTINSERT ... RETURNING)的语句时,这是适当的。如果您正在对数据库进行更新,然后想知道有多少元组受到影响,那么您需要使用返回:

(1) SQL 数据操作语言(DML)的行计数 语句或(2)0表示不返回任何值的 SQL 语句

您可以在更新后使用 ROW_COUNT或使用以下代码插入:

insert into distributors (did, dname) values (DEFAULT, 'XYZ Widgets');
get diagnostics v_cnt = row_count;

您可以将查询包装在一个事务中,它应该显示 ROLLBACKCOMMIT之前的计数。例如:

BEGIN TRANSACTION;


INSERT .... ;


ROLLBACK TRANSACTION;

如果您运行上面的前两行,它应该会给您计数。然后,如果发现受影响的行数与预期的不同,您可以 ROLLBACK(撤消)插入。如果您确信 INSERT是正确的,那么您可以运行相同的命令,但是将第3行替换为 COMMIT TRANSACTION;

重要提示: 在运行任何 BEGIN TRANSACTION;之后,必须的或者 ROLLBACK;或者 COMMIT;事务,否则事务将创建一个锁,如果您在生产环境中运行,这个锁可以减慢甚至瘫痪整个系统。