Как получить количество удаленных строк в PostgreSQL?

Я ищу способ вернуть количество строк, затронутых предложением DELETE в PostgreSQL. The документация говорится:

при успешном завершении удалить команда возвращает тег команды форма

удалить счет

подсчет количества строк удаленный. Если count равен 0, строк нет соответствует условию (это не считается ошибкой).

Если команда "удалить" содержит ля Предложение RETURNING, результат будет аналогично инструкции SELECT содержащие столбцы и значения определено в возвращаемом списке, вычисляется по строке(строкам), удаленной команда.

но мне трудно найти хороший пример этого. Может кто-нибудь помочь мне с этим, как узнать, сколько строк было удалено?


EDIT: Я принял решение Милена, но хотел предложить альтернативу. это я выяснил позже. Его можно найти в здесь, пояснил, под 38.5.5. Получение статуса результата название.

5 ответов


вам нужно PQcmdTuples


можно использовать 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;

Это должно возвращать только количество удаленных строк.


Это должно быть просто в Java.

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

посмотреть java.язык SQL.Заявление.


в Python с использованием psycopg2,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")

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