Создание строки, неактивной в MySQL

Действительно ли возможно сделать строку в MySQL неактивной? Таким образом, эта строка больше не используется в результатах запросов? Мой клиент хочет сохранить удаленных участников, существует в базе данных, но я не хочу редактировать все запросы, чтобы проверить, удален ли участник или нет.

Или есть ли простой способ переместить все данные строки в другую "неактивную" таблицу?

7
задан Daniel Vassallo 22 June 2010 в 09:20
поделиться

4 ответа

Вы можете переименовать текущую таблицу, создать в ней столбец «удалено», а затем создать представление с тем же именем, что и текущая таблица, выбрав все, где удалено = 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;
10
ответ дан 6 December 2019 в 10:47
поделиться

Вы можете, как сами предлагаете, скопировать их в новую таблицу с той же структурой при удалении

2
ответ дан 6 December 2019 в 10:47
поделиться

То, что вы описали, обычно называется мягким удалением.

Перемещение строк между различными таблицами редко является хорошей идеей в реляционных базах данных. В общем, вы не должны перемещать записи только потому, что изменился какой-то их атрибут (а "бездействие" в данном случае - это просто атрибут).

Я бы добавил в таблицу поле inactive, установив его в 0, если строка активна, и в 1, если неактивна. Однако вам придется отфильтровать неактивные строки из всех запросов, добавив WHERE inactive = 0 в пункты WHERE. Альтернативой этому может быть использование представления, как @Brian предложил в другом ответе, который я рекомендую.

6
ответ дан 6 December 2019 в 10:47
поделиться

Триггер на удаление - это то, что вам нужно.

Пример использования:

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.

надеюсь, что это поможет.

0
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

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