Действительно ли возможно сделать строку в MySQL неактивной? Таким образом, эта строка больше не используется в результатах запросов? Мой клиент хочет сохранить удаленных участников, существует в базе данных, но я не хочу редактировать все запросы, чтобы проверить, удален ли участник или нет.
Или есть ли простой способ переместить все данные строки в другую "неактивную" таблицу?
Вы можете переименовать текущую таблицу, создать в ней столбец «удалено», а затем создать представление с тем же именем, что и текущая таблица, выбрав все, где удалено = 0. Таким образом, вам не нужно менять все запросы. Представление будет обновляться, если вы укажете значение по умолчанию для столбца удаления. _
CREATE TABLE my_new_table (col1 INTEGER,
col2 INTEGER,
col3 INTEGER,
deleted INTEGER NOT NULL DEFAULT 0);
INSERT INTO my_new_table (col1, col2, col3)
SELECT (col1, col2, col3)
FROM my_table;
DROP TABLE my_table;
CREATE VIEW my_table (col1, col2, col3)
AS SELECT (col1, col2, col3)
FROM my_new_table
WHERE deleted = 0;
Вы можете, как сами предлагаете, скопировать их в новую таблицу с той же структурой при удалении
То, что вы описали, обычно называется мягким удалением.
Перемещение строк между различными таблицами редко является хорошей идеей в реляционных базах данных. В общем, вы не должны перемещать записи только потому, что изменился какой-то их атрибут (а "бездействие" в данном случае - это просто атрибут).
Я бы добавил в таблицу поле inactive
, установив его в 0
, если строка активна, и в 1
, если неактивна. Однако вам придется отфильтровать неактивные строки из всех запросов, добавив WHERE inactive = 0
в пункты WHERE
. Альтернативой этому может быть использование представления, как @Brian предложил в другом ответе, который я рекомендую.
Триггер на удаление - это то, что вам нужно.
Пример использования:
CREATE TRIGGER Users_archiver
AFTER delete ON users
FOR EACH ROW
BEGIN
insert into users_archive values(old.id,old.username,old.first_name,
old.last_name,old.password);
END$$
delimiter ;
Это позволит сохранить копию удаленной строки во второй таблице с именем users_archive.
надеюсь, что это поможет.