我正在寻找一种方法来返回PostgreSQL中受DELETE子句影响的行数。 documentation表示;
成功完成后,删除 命令返回的命令标记 形式
删除计数
计数是行数 删除。如果count为0,则没有行 符合条件(这不是 被视为错误。)
如果DELETE命令包含 RETURNING子句,结果将是 类似于SELECT语句 包含列和值 在RETURNING列表中定义, 计算删除的行 命令。
但我很难找到一个很好的例子。任何人都可以帮助我,如何找出删除了多少行?
修改 我接受了Milen的解决方案,但我想提出一个我后来发现的替代方案。它可以在here中找到,在 38.5.5下解释。获取结果状态标题。
答案 0 :(得分:52)
您可以使用RETURNING
子句:
DELETE FROM table WHERE condition IS TRUE RETURNING *;
之后你只需要检查返回的行数。您可以使用CTE简化它:
WITH deleted AS (DELETE FROM table WHERE condition IS TRUE RETURNING *) SELECT count(*) FROM deleted;
这应该只返回已删除的行数。
答案 1 :(得分:7)
这在Java中应该很简单。
Statement stmt = connection.createStatement();
int rowsAffected = stmt.executeUpdate("delete from your_table");
System.out.println("deleted: " + rowsAffected);
答案 2 :(得分:6)
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
答案 3 :(得分:3)
在使用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")
答案 4 :(得分:0)
这适用于函数。它也适用于 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;
答案 5 :(得分:-3)
您需要PQcmdTuples
中的libpq
功能。以PHP为例,其中包含pg_affected_rows
。