Получить количество записей, затронутых INSERT или UPDATE в PostgreSQL - PullRequest
42 голосов
/ 28 октября 2010

Мой драйвер базы данных для PostgreSQL 8/9 не возвращает количество записей, затронутых при выполнении INSERT или UPDATE.

PostgreSQL предлагает нестандартный синтаксис " RETURNING ", который выглядит как хороший обходной путь.Но какой может быть синтаксис?В примере возвращается идентификатор записи, но мне нужно количество.

ВСТАВИТЬ INTO распространителям (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING did ;

Ответы [ 4 ]

62 голосов
/ 20 сентября 2014

Я знаю, что этот вопрос 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;

На днях мне действительно нужно приступить к написанию сонета любви к предложению WITH в PostgreSQL ...

21 голосов
/ 29 октября 2010

Я согласен с Милен, ваш водитель должен сделать это для вас.Какой драйвер вы используете и на каком языке?Но если вы используете plpgsql, вы можете использовать GET DIAGNOSTICS my_var = ROW_COUNT;

http://www.postgresql.org/docs/current/static/plpgsql-statements.html

4 голосов
/ 10 июля 2018

Вы можете взять ROW_COUNT после обновления или вставить с этим кодом:

insert into distributors (did, dname) values (DEFAULT, 'XYZ Widgets');
get diagnostics v_cnt = row_count;
0 голосов
/ 26 февраля 2015

Из вашего вопроса не ясно, как вы называете утверждение.Предполагая, что вы используете что-то вроде JDBC, вы можете называть это запросом, а не обновлением.Из JDBC executeQuery:

Выполняет заданный оператор SQL, который возвращает один объект ResultSet.

Поэтому это уместно при выполненииоператор, который возвращает некоторые результаты запроса, такие как SELECT или INSERT ... RETURNING.Если вы обновляете базу данных, а затем хотите узнать, сколько кортежей было затронуто, вам нужно использовать executeUpdate, который возвращает:

либо (1)количество строк для операторов языка данных SQL (DML) или (2) 0 для операторов SQL, которые ничего не возвращают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...