Одновременное добавление данных в 3 таблицы Postgres

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

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

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

Для одновременной вставки данных в несколько взаимосвязанных таблиц PostgreSQL предлагает использовать коммон-табличные выражения (CTE). В приведенном ниже примере показана последовательность вставки данных в table1, table2 и table3. Ключевое слово RETURNING позволяет получить значения идентификаторов id из table1 и table2 и использовать их в качестве внешних ключей.

SQL
Скопировать код
-- Приготовимся к маневрам с данными! 🚀
WITH insert1 AS (
  INSERT INTO table1 (col1) VALUES ('val1') RETURNING id -- Возвращается id🕵️‍♂️
),
insert2 AS (
  INSERT INTO table2 (table1_id, col2) 
  SELECT id, 'val2' FROM insert1 RETURNING id -- id возвращается с новым значением
)
INSERT INTO table3 (table2_id, col3)
SELECT id, 'val3' FROM insert2; -- Финальный этап для id 🏁

Для выполнения этого SQL-запроса замените col1, col2, col3 (названия столбцов) и val1, val2, val3 (значения) на свои данные. В каждом запросе будет сгенерирован новый id, который затем передается для использования внутри других запросов.

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

Обеспечение целостности данных и управление дубликатами

В работе с взаимосвязанными таблицами критически важно поддерживать целостность данных. Для обеспечения связей между таблицами всегда используйте ограничение внешнего ключа.

Дубликаты — это нежелательные примеси в ваших данных. Для их управления используйте ограничение UNIQUE на ключевых колонках. В случае возникновения конфликтов при вставке, можно использовать конструкцию ON CONFLICT, как показано в следующем примере:

SQL
Скопировать код
-- Прощай, дублирование! 🚫👥
INSERT INTO table1 (col1)
VALUES ('unique_value')
ON CONFLICT (col1) DO NOTHING; -- Отступаем при обнаружении дубликата

Эта конструкция предотвращает вставку дубликата в table1, если запись с таким значением unique_value уже существует. При обнаружении дубликата, оператор DO NOTHING предотвращает добавление дублирующих данных.

Поддержание транзакционной целостности и шаблонов SQL-запросов

Транзакционная целостность обеспечивает надежность данных. Заключите операции вставки в блок команд BEGIN и COMMIT, чтобы все действия были обработаны целиком и единообразно.

Для облегчения работы с повторяющимися запросами используйте хранимые процедуры или функции. Они позволяют создать переиспользуемые SQL-шаблоны для управления сложными операциями вставки в разные таблицы.

Управление одновременным доступом

Для управления одновременными записями и предотвращения конфликтов при операциях с данными, в PostgreSQL предусмотрены механизмы блокировки и уровни изоляции транзакций:

SQL
Скопировать код
-- Организуем последовательное выполнение операций.
BEGIN;
LOCK TABLE table1 IN SHARE ROW EXCLUSIVE MODE; -- Резервируем место для table1 📛
WITH insert1 AS (
  INSERT INTO table1 (col1) VALUES ('val1') RETURNING id
)
-- далее следуют остальные операции вставки...
COMMIT;

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

Допустим, вы хотите соединить три разных элемента на одной тарелке:

Markdown
Скопировать код
Элемент 1 (🍚): Рис
Элемент 2 (🍗): Курица
Элемент 3 (🥦): Брокколи

Создание гармоничной комбинации (🍽️) подразумевает идеальное сочетание каждого из этих ингредиентов.

SQL
Скопировать код
BEGIN;
  INSERT INTO table_rice (id, name) VALUES (1, 'Басмати');
  INSERT INTO table_chicken (id, name, rice_id) VALUES (1, 'Гриль', 1);
  INSERT INTO table_broccoli (id, name, chicken_id) VALUES (1, 'На пару', 1);
COMMIT;

Как и в готовке идеального блюда, транзакции PostgreSQL гарантируют, что все элементы (данные) находятся там, где они должны быть (в таблицах).

Максимизация эффективности с помощью временных таблиц и CTE

Использование временных таблиц или CTE в сложных операциях вставки обеспечивает промежуточное хранение данных. Это особенно актуально при обработке больших объемов информации или когда необходима предварительная обработка данных:

SQL
Скопировать код
BEGIN;
CREATE TEMPORARY TABLE tmp_data AS
SELECT data_col1, data_col2 FROM source_table WHERE condition; -- Создана временная таблица!

-- Далее выполняем вставку из временной таблицы в целевые таблицы
-- ...

DROP TABLE tmp_data; -- Словно иллюзионист, таблица исчезает после выполнения задачи
COMMIT;

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

  1. PostgreSQL: Документация по команде INSERT — Ознакомьтесь с основами операции вставки в PostgreSQL.
  2. PostgreSQL: Рекомендации по наполнению базы данных — Узнайте о групповых операциях вставки и способах заполнения баз данных PostgreSQL.
  3. Обсуждение стандартов объектов в JavaScript на Stack Overflow — Обсуждение в контексте баз данных, относящееся к вставкам в несколько таблиц.
  4. PostgreSQL: Описание триггерных функций — Изучите использование триггерных функций в PostgreSQL для автоматизации операций.
  5. PostgreSQL: Об ограничениях — Понимание, как ограничения помогают поддерживать целостность данных в PostgreSQL.
  6. Stack Overflow: Вставка данных в несколько таблиц MySQL (нормализация базы данных?) — Узнайте о лучших методах множественной вставки и нормализации баз данных.