Одновременная вставка данных в PostgreSQL: метод RETURNING ID

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

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

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

Для извлечения id в PostgreSQL следует использовать выражение INSERT INTO...SELECT, дополненное RETURNING внутри CTE (Common Table Expressions):

SQL
Скопировать код
WITH inserted AS (
  INSERT INTO target_table (col1, col2)
  SELECT col1, col2 FROM source_table
  RETURNING id
)
SELECT id FROM inserted;

Исполняя этот запрос, вы вставляете данные из source_table в target_table и сразу получаете новые id для дальнейшего использования.

Кинга Идем в IT: пошаговый план для смены профессии

Применение RETURNING в транзакциях

В рамках транзакций возвращаемые id можно присвоить локальным переменным, обеспечив моментальный доступ к ним для последующих операций:

SQL
Скопировать код
BEGIN;

WITH inserted AS (
  INSERT INTO clients (name, email)
  SELECT name, email FROM new_clients_temp
  RETURNING id
)
SELECT id INTO my_new_client_id FROM inserted;

UPDATE orders SET client_id = my_new_client_id WHERE order_id = my_target_order_id;

COMMIT;

Применение RETURNING в транзакции и сохранение результатов в переменной обеспечивают эффективность и плавность выполнения операций в рамках одной транзакции.

Отложенная вставка пакетов с использованием массивов

Для вставки большого количества строк и получения их id используйте массивы или сразу обрабатывайте id:

SQL
Скопировать код
WITH inserted AS (
  INSERT INTO blogs (title, content)
  SELECT title, content FROM imported_blogs
  RETURNING id
)
SELECT array_agg(id) FROM inserted;

этот подход позволяет выполнять массовые операции и удобно собирать все новые идентификаторы.

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

Процесс INSERT FROM SELECT RETURNING ID в PostgreSQL визуализируется так:

⚙️ Транспортировка данных: КОПИРОВАНИЕ ➡️ СОЗДАНИЕ + ИДЕНТИФИКАЦИЯ 🏷️

В SQL это выглядит следующим образом:

SQL
Скопировать код
INSERT INTO destination_table
SELECT * FROM source_table
RETURNING id;

Снова визуализируем наш процесс:

Задача: 📜[Исходные данные]
Результат: 📊[Новые данные] ➕ 🏷️[ID]

Данный процесс упрощает понимание переноса данных из одной таблицы в другую с идентификацией по уникальному id.

Автоматизация с помощью функций и триггеров

Для автоматизации обработки данных можно сочетать RETURNING id с функциями и триггерами базы данных:

SQL
Скопировать код
CREATE OR REPLACE FUNCTION insert_with_trigger() RETURNS TRIGGER AS $$
BEGIN
  NEW.dealer_id := (INSERT INTO dealers (name) VALUES (NEW.dealer_name) RETURNING id);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_before_insert
BEFORE INSERT ON vehicles
FOR EACH ROW EXECUTE FUNCTION insert_with_trigger();

Такой подход упрощает логику создания связанных записей, например, между транспортными средствами и дилерами.

Советы, ограничения и возможные проблемы

  • Осторожно, NULL: Убедитесь, что ваш SELECT не содержит неожиданных значений NULL.
  • Типы данных: При выполнении операций вставки следите за совместимостью типов данных.
  • Исключите дублирование: Используйте DISTINCT в SELECT обдуманно, чтобы предотвратить повторную вставку.
  • Оптимальное выполнение: Для работы с большими объёмами данных используйте батчинг или другие методы оптимизации.

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

  1. PostgreSQL INSERT RETURNING ClauseУчебная статья про INSERT RETURNING.
  2. The SQL INSERT INTO SELECT Statement – W3SchoolsОсновы SQL INSERT INTO SELECT.
  3. PostgreSQL Documentation: INSERTОфициальное руководство PostgreSQL по INSERT.
  4. Stack Overflow: INSERT INTO...RETURNING exampleПримеры использования RETURNING.
  5. PostgresOpen 2019Материалы конференции о текущем состоянии проекта PostgreSQL.