Как получить количество затронутых строк в PostgreSQL
Быстрый ответ
Если вам требуется определить количество строк, затронутых операциями INSERT
или UPDATE
в PostgreSQL, примените команду RETURNING
после INSERT
или UPDATE
. Результат поместите в подзапрос для последующего подсчёта с использованием count(*)
. Это эффективный метод, подобный набору инструментов Бэтмена!
Пример для INSERT
:
INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
RETURNING null;
Оберните это в подзапрос с SELECT count(*)
для получения результата:
SELECT count(*) FROM (
INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
RETURNING *
) as subquery;
Для UPDATE
подход аналогичен.
В PL/pgSQL применяйте GET DIAGNOSTICS
для определения количества измененных строк:
DO $$
DECLARE
rows_affected int;
BEGIN
UPDATE table_name SET column1 = value1 WHERE column2 = 'condition';
GET DIAGNOSTICS rows_affected = ROW_COUNT;
RAISE NOTICE 'Rows affected: %', rows_affected;
END $$;
Практическое руководство: Эффективный подсчёт записей
Управление транзакциями: Искусство безупречности
В процессе транзакции следите за целостностью данных и эффективностью, подобно осторожному акробату, бросающему в воздух множество бензопил. Если обновление или вставка не удалась, проведите откат:
BEGIN;
-- Insert or update
ROLLBACK; -- Если возникает проблема.
Если всё идет гладко, подтвердите выполнение транзакции:
COMMIT; -- Это знак успешного завершения.
Управление JDBC: Другой способ обеспечить безупречность
При использовании JDBC для подключения к PostgreSQL, количество затронутых записей определяется с помощью executeUpdate
:
// Определение количества измененных строк
int affectedRows = statement.executeUpdate();
Переменная affectedRows
содержит количество строк, затронутых операцией.
Совместимость с драйвером: Важность обновления
Убедитесь, что ваш драйвер PostgreSQL поддерживает ключевое слово RETURNING
. Возможно, вам стоит обновить драйвер до последней версии для эффективной работы с самыми последними возможностями PostgreSQL, включая подсчёт измененных записей.
Визуализация
Считайте запрос следующим образом:
До управления SQL: 🎫🎫🎫 (билеты выбраны)
Выполнение INSERT
или UPDATE
:
INSERT INTO passengers (name, destination) VALUES ('Alice', 'Wonderland');
После управления SQL: 🎫🎫🎫🎫 (добавлен один билет)
Каждый билет — это запись, добавленная или измененная в вашей базе данных.
Скорость работы при использовании запросов WITH
Применение запросов WITH (Общих Табличных Выражений, CTE) увеличит скорость операций. В сочетании с RETURNING
это раскрывает весь потенциал управления данными:
WITH rows AS (
UPDATE table_name SET column1 = value1 WHERE column2 = 'condition'
RETURNING *
)
SELECT count(*) FROM rows;
Избегание ошибок при изменении данных: Массовое обновление строк
В случае массового UPDATE
убедитесь, что RETURNING
корректно подсчитывает измененные строки:
UPDATE table_name
SET column1 = 'new_value'
WHERE column2 > 10
RETURNING *;
Предотвращение распространённых проблем
Будьте осторожны с длительными транзакциями при высокой нагрузке — это может привести к узким местам в производительности или блокировкам. Также следите за тем, чтобы синтаксис SQL соответствовал версии PostgreSQL.
Полезные материалы
- PostgreSQL: Документация: 16: INSERT
- PostgreSQL: Документация: 16: 43.6. Структуры управления
- upsert – Как выполнить операцию Insert, on duplicate update в PostgreSQL? – Stack Overflow
- Получение статуса результата – PostgreSQL wiki
- PostgreSQL: Документация: 16: INSERT
- Использование изменяющих данные инструкций в WITH – CYBERTEC
- Простой способ всегда делать поле в базе данных строчными буквами – Stack Overflow