【问题标题】:Making a row inactive in MySQL在 MySQL 中使一行处于非活动状态
【发布时间】:2011-03-06 16:46:42
【问题描述】:

是否可以让 MySQL 中的一行处于非活动状态?那么这一行不再用于查询结果了吗? 我的客户希望保留已删除的成员存在于数据库中,但我不想编辑所有查询以检查该成员是否已删除。

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

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    您所描述的通常称为soft delete

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

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

    【讨论】:

    • "但我不想编辑所有查询的[原文]来检查成员是否被删除"
    • 我怎么会错过呢? :) ...(更新了我的答案)
    • 你是如何更新你的答案的,这样他就不必再编辑所有的查询了?在修订版 3 中,您仍然提到“您必须从所有查询中过滤掉不活动的行......”。
    • 不更改查询的选项是使用在其定义中包含 WHERE 子句的 VIEW。
    • @Daniel:啊,聪明。没想到:)
    【解决方案2】:

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

    【讨论】:

    • 如果您使用“删除时”触发器尤其容易
    【解决方案3】:

    您可以重命名当前表,在其中创建“已删除”列,然后创建一个与当前表同名的视图,选择所有已删除=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 表示视图。您能否提供一个指向创建视图语法的链接,或如何执行此操作的示例,以便 OP 知道从这里去哪里?
    • 但是当我想更新成员表中的一些数据时,我不能使用视图表来更新这些数据,对吧?所以我必须更改所有更新查询来更新 my_new_table(对于这个例子)?
    • 这样定义的视图应该是可更新的...试试吧!也就是说,INSERT INTO my_table(col1,col2,col3) 值(1,2,3);和 UPDATE my_table SET col1 = 1 WHERE col2 = 5;当 my_table 被定义为这样的视图时,应该都可以工作。
    【解决方案4】:

    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 的第二个表中。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      相关资源
      最近更新 更多