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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам требуется определить количество строк, затронутых операциями INSERT или UPDATE в PostgreSQL, примените команду RETURNING после INSERT или UPDATE. Результат поместите в подзапрос для последующего подсчёта с использованием count(*). Это эффективный метод, подобный набору инструментов Бэтмена!

Пример для INSERT:

SQL
Скопировать код
INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
RETURNING null;

Оберните это в подзапрос с SELECT count(*) для получения результата:

SQL
Скопировать код
SELECT count(*) FROM (
  INSERT INTO table_name (column1, column2)
  VALUES (value1, value2)
  RETURNING *
) as subquery;

Для UPDATE подход аналогичен.

В PL/pgSQL применяйте GET DIAGNOSTICS для определения количества измененных строк:

SQL
Скопировать код
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 $$;
Кинга Идем в IT: пошаговый план для смены профессии

Практическое руководство: Эффективный подсчёт записей

Управление транзакциями: Искусство безупречности

В процессе транзакции следите за целостностью данных и эффективностью, подобно осторожному акробату, бросающему в воздух множество бензопил. Если обновление или вставка не удалась, проведите откат:

SQL
Скопировать код
BEGIN;
-- Insert or update
ROLLBACK; -- Если возникает проблема.

Если всё идет гладко, подтвердите выполнение транзакции:

SQL
Скопировать код
COMMIT; -- Это знак успешного завершения.

Управление JDBC: Другой способ обеспечить безупречность

При использовании JDBC для подключения к PostgreSQL, количество затронутых записей определяется с помощью executeUpdate:

Java
Скопировать код
// Определение количества измененных строк
int affectedRows = statement.executeUpdate();

Переменная affectedRows содержит количество строк, затронутых операцией.

Совместимость с драйвером: Важность обновления

Убедитесь, что ваш драйвер PostgreSQL поддерживает ключевое слово RETURNING. Возможно, вам стоит обновить драйвер до последней версии для эффективной работы с самыми последними возможностями PostgreSQL, включая подсчёт измененных записей.

Визуализация

Считайте запрос следующим образом:

До управления SQL: 🎫🎫🎫 (билеты выбраны)

Выполнение INSERT или UPDATE:

SQL
Скопировать код
INSERT INTO passengers (name, destination) VALUES ('Alice', 'Wonderland');
После управления SQL: 🎫🎫🎫🎫 (добавлен один билет)

Каждый билет — это запись, добавленная или измененная в вашей базе данных.

Скорость работы при использовании запросов WITH

Применение запросов WITH (Общих Табличных Выражений, CTE) увеличит скорость операций. В сочетании с RETURNING это раскрывает весь потенциал управления данными:

SQL
Скопировать код
WITH rows AS (
  UPDATE table_name SET column1 = value1 WHERE column2 = 'condition'
  RETURNING *
)
SELECT count(*) FROM rows;

Избегание ошибок при изменении данных: Массовое обновление строк

В случае массового UPDATE убедитесь, что RETURNING корректно подсчитывает измененные строки:

SQL
Скопировать код
UPDATE table_name
SET column1 = 'new_value'
WHERE column2 > 10
RETURNING *;

Предотвращение распространённых проблем

Будьте осторожны с длительными транзакциями при высокой нагрузке — это может привести к узким местам в производительности или блокировкам. Также следите за тем, чтобы синтаксис SQL соответствовал версии PostgreSQL.

Полезные материалы

  1. PostgreSQL: Документация: 16: INSERT
  2. PostgreSQL: Документация: 16: 43.6. Структуры управления
  3. upsert – Как выполнить операцию Insert, on duplicate update в PostgreSQL? – Stack Overflow
  4. Получение статуса результата – PostgreSQL wiki
  5. PostgreSQL: Документация: 16: INSERT
  6. Использование изменяющих данные инструкций в WITH – CYBERTEC
  7. Простой способ всегда делать поле в базе данных строчными буквами – Stack Overflow