@Esm322

Как удалить строку из одной таблицы и добавить эту же строку в другую таблицу?

Необходимо удалить строку из одной таблицы и эту же строку добавить в другую таблицу. Например, есть таска, после того как ее выполнят, она должна перейти из активных таск в архивные. Я видел реализацию так, что у меня будет 2 таблицы с одинаковыми типами данных и во время удаления из активных таск, она должна перенпстись в архивную таблицу путём копирования, чтобы при этом мне не нужно было передавать в body при запросе данные этой таски. Как это можно реализовать?
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 4
@alexalexes
Вот такие проектировщики плодят кучу таблиц под одну сущность.
Яркий пример, под каждый год отчетности создают таблицы <название_таблицы>_<год_отчетности>.
Не надо так, пожалуйста.
В вашем случае, ситуация ровно таже самая.
Добавьте в существующий статус задачи еще одно значение - "Архивный", либо создайте отдельный атрибут под этот признак. И, обязательно, проиндексируйте его.
В бизнес-логике очень легко отсеять записи с неподходящим статусом.
Если не хотите, чтобы бизнес-логика видела ненужные записи, делайте для нее свое view.
Есть, конечно, случай, когда таблица становится очень большой, и нужно облегчить накладные расходы по ее хранению, то в этом случае настраивают партиции таблицы. Но это тонкое администрирование.
PS: Если задача требует переноса данных в один присест и это не ошибка проектирования архитектуры, то это выполняется как любое неэлементарное действие с помощью транзакций в процедурном режиме выполнения SQL:
- открываем транзакцию;
- делаем insert с select;
- делаем delete;
- закрываем транзакцию.
Только имейте ввиду, что в транзакции не должны прогонятся длинные выборки ни в insert-е, ни в delete. Это влияет на время блокировки таблиц, и сильно затратно по производительности, так как существенно перестраиваются индексы. Нужно аккуратно использовать такие процедуры (по правилу: "семь раз селекть, один раз делеть"), иначе получите залочивание на длительный период.
Ответ написан
Комментировать
@elderl
INSERT INTO
  SELECT
DELETE


Но это не правильно. Сделайте в таблице заданий поле-признак выполнения.
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL, Python, Telegram
триггер на DELETE в первой таблице, в триггере получаешь удаленный row и вставляешь в другую таблицу
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
мне необходимо удалить строку из одной таблицы и эту же строку добавить в другую таблицу.

В PostgreSQL это вообще элементарная операция. Можно удалить запись в CTE и вставить её во внешнем запросе, можно наоборот. То, как выполнять, определяется возможными зависимостями и интерференциями.
WITH cte AS (
    DELETE
    FROM table1
    WHERE {criteria}
    RETURNING *
)
INSERT 
INTO table2
SELECT *
FROM cte;

-- или 

WITH cte AS (
    INSERT 
    INTO table2
    SELECT *
    FROM table1
    WHERE {criteria}
    RETURNING id
)
DELETE
FROM table1
WHERE id IN (
    SELECT id
    FROM cte
);

Sample fiddle

Само собой, вместо звёзд может быть (даже правильнее сказать - должен быть) перечень определённых полей и выражений.

PS. Хотя намного разумнее оставить одну таблицу и выполнять "мягкое удаление". Внимательнейшим образом прочитайте ответ alexalexes. При очень большом количестве записей, влияющем на производительность, такую таблицу можно и секционировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы