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

时间:2010-10-27 23:45:30

标签: sql postgresql sql-update

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

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

  

INSERT INTO经销商(确实,dname)价值观(默认,'XYZ Widgets')       RETURNING ;

5 个答案:

答案 0 :(得分:58)

我知道这个问题是oooolllllld,我的解决方案可能过于复杂,但这是我最喜欢的解决方案!

无论如何,我必须做同样的事情并让它像这样工作:

-- 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子句写一个爱的十四行诗......

答案 1 :(得分:20)

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

http://www.postgresql.org/docs/current/static/plpgsql-statements.html

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

您可以将查询包装在事务中,并且应该在您ROLLBACKCOMMIT之前显示计数。示例:

BEGIN TRANSACTION;

INSERT .... ;

ROLLBACK TRANSACTION;

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

重要说明:运行任何BEGIN TRANSACTION;后,您必须 ROLLBACK;COMMIT;交易,否则交易将如果您在生产环境中运行,请创建一个可以减慢甚至削弱整个系统的锁。

答案 4 :(得分:0)

从您的问题中不清楚您是如何称呼该声明的。假设您正在使用类似JDBC的东西,您可能会将其称为查询而不是更新。来自JDBC的executeQuery

  

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

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

  

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