Да, в PostgreSQL можно выполнить два зависимых INSERT-запроса в разные таблицы одним запросом, используя выражение WITH
(Common Table Expressions) и конструкцию INSERT INTO ... SELECT ...
.
Для наглядности предположим, что у нас есть две таблицы: table1
и table2
. Предположим также, что table2
имеет столбец table1_id
, который является внешним ключом, указывающим на id
строки в table1
, и мы хотим выполнить вставку данных в обе таблицы в едином запросе.
Ниже приведен пример запроса:
WITH inserted_data AS ( INSERT INTO table1 (column1, column2) VALUES ('value1', 'value2') RETURNING id ) INSERT INTO table2 (table1_id, column3) SELECT id, 'value3' FROM inserted_data;
В этом примере мы создаем временную таблицу inserted_data
, которая содержит результат первого INSERT-запроса в table1
. Мы используем конструкцию RETURNING
для возврата id
только что вставленной строки в table1
.
Затем мы выполняем второй INSERT-запрос в table2
, используя SELECT
из временной таблицы inserted_data
, чтобы получить значение внешнего ключа для вставки в table2
. Мы также указываем значение для column3
как 'value3'.
Вы можете адаптировать этот пример под вашу ситуацию, указав соответствующие названия таблиц, столбцов и значения. Обратите внимание, что порядок вставки может быть важен, поскольку имеет значение, какая таблица зависит от другой.
Однако стоит знать, что этот подход не гарантирует атомарность операции. Если первый INSERT завершится успешно, но второй INSERT вызовет ошибку, тогда состояние базы данных будет несогласованным. Есть риски утери данных или нарушения целостности.