【发布时间】:2011-03-06 16:46:42
【问题描述】:
是否可以让 MySQL 中的一行处于非活动状态?那么这一行不再用于查询结果了吗? 我的客户希望保留已删除的成员存在于数据库中,但我不想编辑所有查询以检查该成员是否已删除。
或者有没有一种简单的方法可以将整个行数据移动到另一个“非活动”表中?
【问题讨论】:
是否可以让 MySQL 中的一行处于非活动状态?那么这一行不再用于查询结果了吗? 我的客户希望保留已删除的成员存在于数据库中,但我不想编辑所有查询以检查该成员是否已删除。
或者有没有一种简单的方法可以将整个行数据移动到另一个“非活动”表中?
【问题讨论】:
您所描述的通常称为soft delete。
在不同的表之间移动行在关系数据库中很少是一个好主意。一般来说,您不应该仅仅因为记录的某些属性发生了变化而移动记录(在这种情况下,“不活动”只是一个属性)。
我会在表中添加一个inactive 字段,如果该行处于活动状态,则将其设置为0,如果该行处于非活动状态,则设置为1。但是,您必须通过在 WHERE 子句中添加 WHERE inactive = 0 来过滤掉所有查询中的非活动行。另一种方法是使用视图,如@Brian suggested in the other answer,我建议这样做。
【讨论】:
您可以按照自己的建议将它们复制到删除时具有相同结构的新表中
【讨论】:
您可以重命名当前表,在其中创建“已删除”列,然后创建一个与当前表同名的视图,选择所有已删除=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;
【讨论】:
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 的第二个表中。
希望这会有所帮助。
【讨论】: