PostgreSQL 8/9的数据库驱动程序在执行INSERT
或UPDATE
时不会返回受影响的记录数。
PostgreSQL提供了非标准语法“RETURNING”,这似乎是一个很好的解决方法。但是语法可能是什么?该示例返回记录的ID,但我需要计数。
INSERT INTO经销商(确实,dname)价值观(默认,'XYZ Widgets') RETURNING ;
答案 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)
您可以将查询包装在事务中,并且应该在您ROLLBACK
或COMMIT
之前显示计数。示例:
BEGIN TRANSACTION;
INSERT .... ;
ROLLBACK TRANSACTION;
如果运行上面的前两行,它应该可以计数。然后,如果发现受影响的行数不是预期的,则可以ROLLBACK
(撤消)插入。如果您对INSERT
是正确的感到满意,则可以运行相同的命令,但将第3行替换为COMMIT TRANSACTION;
。
重要说明:运行任何BEGIN TRANSACTION;
后,您必须 ROLLBACK;
或COMMIT;
交易,否则交易将如果您在生产环境中运行,请创建一个可以减慢甚至削弱整个系统的锁。
答案 4 :(得分:0)
从您的问题中不清楚您是如何称呼该声明的。假设您正在使用类似JDBC的东西,您可能会将其称为查询而不是更新。来自JDBC的executeQuery
:
执行给定的SQL语句,该语句返回单个ResultSet 对象
因此,当您执行返回某些查询结果的语句(例如SELECT
或INSERT ... RETURNING
)时,这是合适的。如果要对数据库进行更新,然后想知道有多少元组受到影响,则需要使用返回的executeUpdate
:
(1)SQL数据操作语言(DML)的行数 语句或(2)0表示不返回任何内容的SQL语句