在MySQL中使行无效

时间:2010-06-22 08:03:09

标签: php sql mysql

是否可以在MySQL中使一行无效?那么这一行不再用于查询结果了? 我的客户希望保留已删除的成员存在于数据库中,但我不想编辑所有查询以检查成员是否被删除。

或者有一种简单的方法可以将整个行数据移动到另一个“非活动”表中吗?

4 个答案:

答案 0 :(得分:10)

您可以重命名当前表,在其中创建“已删除”列,然后创建一个与当前表同名的视图,选择所有删除的值= 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;

答案 1 :(得分:6)

您所描述的内容通常称为soft delete

在关系数据库中,在不同表之间移动行很少是个好主意。一般情况下,你不应该仅仅因为关于它们的某些属性发生了变化而移动记录(在这种情况下,“不活动”只是一个属性)。

我会在表格中添加inactive字段,如果该行处于活动状态,则将其设置为0,如果处于非活动状态,则设置为1。但是,您必须通过在WHERE inactive = 0子句中添加WHERE来过滤掉所有查询中的非活动行。另一种方法是使用我推荐的@Brian suggested in the other answer视图。

答案 2 :(得分:2)

您可以建议将自己复制到删除时具有相同结构的新表

答案 3 :(得分:0)

您需要On delete trigger

用法示例:

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的表中保存已删除行的副本。

希望这会有所帮助。