如何获取PostgreSQL中删除的行数?

Erk*_*lat 29 postgresql rowcount delete-row sql-delete

我正在寻找一种方法来返回PostgreSQL中受DELETE子句影响的行数.该文件指出,

成功完成后,DELETE命令将返回表单的命令标记

删除计数

计数是删除的行数.如果count为0,则没有符合条件的行(这不被视为错误).

如果DELETE命令包含RETURNING子句,则结果将类似于SELECT语句的结果,该SELECT语句包含RETURNING列表中定义的列和值,这些列和值是通过命令删除的行计算的.

但我很难找到一个很好的例子.任何人都可以帮我这个,我怎么能找出删除了多少行?


编辑: 我接受了Milen的解决方案,但我想提出一个我后来发现的替代方案.它可以在这里找到,在38.5.5解释.获取结果状态标题.

Jak*_*zak 62

你可以使用RETURNING条款:

DELETE FROM table WHERE condition IS TRUE RETURNING *;
Run Code Online (Sandbox Code Playgroud)

之后,您只需检查返回的行数.您可以使用CTE简化它:

WITH deleted AS (DELETE FROM table WHERE condition IS TRUE RETURNING *) SELECT count(*) FROM deleted;
Run Code Online (Sandbox Code Playgroud)

这应该只返回已删除的行数.

  • 我认为这应该被标记为已被接受. (6认同)
  • 这没有扩展!绝对应该是公认的答案:D (4认同)
  • 这是否比“从条件为真时从表中删除”效率低?例如,Postgres 在评估 CTE 时是否临时将删除的行存储在某处,或者它是否足够聪明,可以看到仅使用计数并仅在删除行时对行进行计数? (4认同)

cop*_*360 11

这在Java中应该很简单.

Statement stmt = connection.createStatement();
int rowsAffected = stmt.executeUpdate("delete from your_table");
System.out.println("deleted: " + rowsAffected);
Run Code Online (Sandbox Code Playgroud)

请参见java.sql.Statement.

  • @Nate,在关于OP问题的第二条评论中,"语言是Java." (7认同)

Dav*_*ave 8

在使用 psycopg2 的 Python 中,可以使用rowcount属性。下面是一个例子来找出有多少行被删除......

cur = connection.cursor()
try:
    cur.execute("DELETE FROM table WHERE col1 = %s", (value,))
    connection.commit()
    count = cur.rowcount
    cur.close()
    print("A total of %s rows were deleted." % count)
except:
    connection.rollback()
    print("An error as occurred, No rows were deleted")
Run Code Online (Sandbox Code Playgroud)


小智 7

GET DIAGNOSTICS用于显示已修改/已删除记录的数量。

样例代码

CREATE OR REPLACE FUNCTION fnName()
  RETURNS void AS
$BODY$
        declare
         count numeric;
       begin
              count := 0;
            LOOP
             -- condition here update or delete;
             GET DIAGNOSTICS count = ROW_COUNT;
             raise notice 'Value: %', count;
             end loop;
        end;
$BODY$a
Run Code Online (Sandbox Code Playgroud)


Dee*_*top 5

这适用于函数。它也可以与 INSERT 等其他操作一起使用。

DECLARE _result INTEGER;
...
DELETE FROM mytable WHERE amount = 0;  -- or whatever other operation you desire
GET DIAGNOSTICS _result = ROW_COUNT;
IF _result > 0 THEN
    RAISE NOTICE 'Removed % rows with amount = 0', _result;
END IF;
Run Code Online (Sandbox Code Playgroud)