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

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

При успешном завершении команда DELETE возвращает тег команды вида

УДАЛИТЬ количество

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

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

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


EDIT: я хотел представить альтернативу, которую нашел позже. Его можно найти здесь, как описано в разделе 38.5. 5. Получение статуса результата.


person Erkan Haspulat    schedule 12.02.2010    source источник
comment
Предпочитаете скриптовый язык? Perl, PHP, Python, C, клингонский?   -  person Paul    schedule 12.02.2010
comment
Большое спасибо. Ваша ссылка очень помогла   -  person jny    schedule 11.10.2011


Ответы (6)


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

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

person Jakub Fedyczak    schedule 20.03.2014
comment
Это работает без расширения! Определенно должен быть принятый ответ: D - person Alfabravo; 06.12.2017

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

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

См. java.sql.Выписка.

person cope360    schedule 13.02.2010
comment
@Nate, во втором комментарии к вопросу ОП утверждает, что язык - Java. - person cope360; 14.05.2013

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
person Ankur Srivastava    schedule 08.02.2017

в 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")
person Dave    schedule 20.03.2014

Это работает в функциях. Он работает и с другими операциями, такими как 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;
person Deepstop    schedule 14.04.2021

Вам нужна функция PQcmdTuples из libpq. Который, например, в PHP обернут как pg_affected_rows.

person Milen A. Radev    schedule 12.02.2010
comment
Строго говоря, вам не нужно это расширение. Ванильный раствор предлагается ниже. - person Craig Labenz; 25.01.2019