Получить количество записей, на которые влияет INSERT или UPDATE в PostgreSQL
Мой драйвер базы данных для PostgreSQL 8/9 не возвращает количество записей, затронутых при выполнении INSERT
или UPDATE
.
PostgreSQL предлагает нестандартный синтаксис RETURNING", который кажется хорошим обходным решением. Но какой может быть синтаксис? В примере возвращается идентификатор записи, но мне нужен счет.
INSERT INTO дистрибьюторы (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING сделал;
Ответы
Ответ 1
Я знаю, что этот вопрос является оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо
В любом случае, я должен был сделать то же самое и заставить его работать следующим образом:
-- 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;
На днях мне действительно нужно разобраться с написанием любовного сонета для предложения PostgreSQL WITH...
Ответ 2
Я согласен с Миленом, ваш водитель должен сделать это за вас. Какой драйвер вы используете и на каком языке? Но если вы используете plpgsql, вы можете использовать GET DIAGNOSTICS my_var = ROW_COUNT;
http://www.postgresql.org/docs/current/static/plpgsql-statements.html
Ответ 3
Из вашего вопроса не ясно, как вы вызываете оператор. Предполагая, что вы используете что-то вроде JDBC, вы можете назвать его скорее запросом, чем обновлением. Из JDBC executeQuery
:
Выполняет данный оператор SQL, который возвращает один ResultSet объект.
Поэтому это целесообразно, когда вы выполняете оператор, который возвращает некоторые результаты запроса, такие как SELECT
или INSERT ... RETURNING
. Если вы делаете обновление базы данных, а затем хотите знать, сколько кортежей было затронуто, вам нужно использовать executeUpdate
, который возвращает:
либо (1) количество строк для языка данных SQL Data Manipulation Language (DML) операторов или (2) 0 для операторов SQL, которые ничего не возвращают