Можно ли сделать строку в 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 ;
Это сохранит вам копию удаленной строки во второй таблице, называемой user_archive.
надеюсь это поможет.