是否可以在MySQL中使一行无效?那么这一行不再用于查询结果了? 我的客户希望保留已删除的成员存在于数据库中,但我不想编辑所有查询以检查成员是否被删除。
或者有一种简单的方法可以将整个行数据移动到另一个“非活动”表中吗?
答案 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)
用法示例:
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的表中保存已删除行的副本。
希望这会有所帮助。