Как насчет использования подхода связного списка , где каждое действие указывает на следующее?
select * from activity;
+----+---------+
| id | next_id |
+----+---------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
| 5 | NULL |
+----+---------+
Если вы хотите удалить операцию с ID = 2, вам нужно обновить строку, которая указывает на ID = 2, до строки, на которую ранее был указан ID = 2.
update activity
set next_id = 3
where id = 1;
delete
from activity
where id = 2;
+----+---------+
| id | next_id |
+----+---------+
| 1 | 3 |
| 3 | 4 |
| 4 | 5 |
| 5 | NULL |
+----+---------+
Если у вас очень длинные списки и вы беспокоитесь о производительности DML, это может быть хорошим вариантом. Недостаток этого метода заключается в том, что запрос к таблице сложнее.