Обновление/Вставка в несколько таблиц данные одним запросом?

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

Тем не менее, некоторые базы данных, такие как PostgreSQL, поддерживают конструкцию WITH (также известную как Common Table Expressions), которая позволяет выполнить несколько операций в рамках одного SQL запроса. С ее помощью можно сначала на основе результатов одного подзапроса обновить данные в одной таблице, а затем использовать эти данные для вставки в другую таблицу.

Пример использования WITH в PostgreSQL для совместного обновления и вставки данных в две таблицы:

WITH updated_rows AS (
    UPDATE table1 SET column1 = 'new_value' WHERE column2 = 'condition'
    RETURNING *
)
INSERT INTO table2 (column1, column2)
SELECT column1, column2 FROM updated_rows;

В запросе выше происходит сначала обновление данных в table1, затем с помощью RETURNING * возвращаются обновленные строки. Затем эти обновленные данные используются для вставки в table2.

Обратите внимание, что данное решение специфично для PostgreSQL и может не поддерживаться другими СУБД. Как правило, если требуется обновить данные в нескольких таблицах одновременно и безопасно, целесообразно разделить это действие на несколько отдельных SQL запросов для четкости и безопасности операций.