Почему бы не отразить ваши таблицы с помощью архивных таблиц?
create table mytable(
col_1 int
,col_2 varchar(100)
,col_3 date
,primary key(col_1)
)
create table mytable_deleted(
delete_id int not null auto_increment
,delete_dtm datetime not null
-- All of the original columns
,col_1 int
,col_2 varchar(100)
,col_3 date
,index(col_1)
,primary key(delete_id)
)
А затем просто добавить триггеры on-delete-в ваши таблицы, которые вставляют текущую строку в зеркальную таблицу перед удалением? Это даст вам очень простое и очень эффективное решение.
Вы можете сгенерировать таблицы и код триггера, используя словарь данных.
Обратите внимание, что я, возможно, не захочу иметь уникальный индекс для исходного первичного ключа (col_1) в таблице архива, потому что вы можете в конечном итоге удалить одну и ту же строку дважды с течением времени, если вы используете естественные ключи. Если вы не планируете подключать архивные таблицы в своем приложении (для отмены), вы можете полностью удалить индекс. Кроме того, я добавил время удаления (delete_dtm) и суррогатный ключ, который можно использовать для удаления удаленных (хе-хе) строк.
Вы можете также рассмотреть возможность разбиения таблицы архива на удаленном_dtm. Это значительно облегчает очистку данных из таблиц.