您在数据库中实现软删除的方法是什么?
理想情况下,解决方案将允许
谢谢!
发布于 2012-02-15 19:04:14
我有几种方法可以做到这一点:
在这两种情况下,您可能都希望找到任何子记录并将其标记为已删除。我想您可以使用触发器或代码来完成此操作。
发布于 2012-02-15 19:05:12
对于本例,让我们使用如下所示的表:
CREATE TABLE parent_data
(
id int not null auto_increment,
...
PRIMARY KEY (id)
);如果要执行软删除,请创建表,该表保存要删除的行的id。也许是这样的:
CREATE TABLE deleted_parent_data SELECT id FROM parent_data WHERE 1=2;
ALTER TABLE deleted_parent_data ADD PRIMARY KEY (id);假设要删除行10、20、30、40、50。只需运行这个:
INSERT IGNORE INTO deleted_parent_data VALUES (10),(20),(30),(40),(50);要查看有效数据,始终必须执行内部连接。
SELECT A.* FROM parent_data A
INNER JOIN deleted_parent_data B
USING (id) WHERE B.id IS NULL;查看已删除的行将非常快。
SELECT B.* FROM deleted_parent_data A
LEFT JOIN parent_data B
USING (id) WHERE B.id IS NOT NULL;要在parent_data中恢复第20行,只需运行
DELETE FROM deleted_parent_data WHERE id = 20;若要永久删除行20和50,请运行两个不能回滚的步骤:
DELETE B.* FROM
(SELECT id FROM deleted_parent_data
WHERE id IN (20,50)) A
LEFT JOIN parent_data B
USING (id) WHERE B.id IS NOT NULL;
DELETE FROM deleted_parent_data WHERE id IN (20,50);如果表child_data中有子记录,则必须有一个单独的delete_child_data表,并以类似的方式管理itin。也许这张桌子看起来是这样的:
CREATE TABLE deleted_child_table SELECT parent_id,id WHERE 1=2;
ALTER TABLE deleted_child_table ADD PRIMARY KEY (id);
ALTER TABLE deleted_child_table ADD UNIQUE KEY (parent_id,id);您可能可以在deleted_parent_table和deleted_child_table之间使用触发器或外键约束,并附带所有ON DELETE CASCADE的提示和提示。这样,deleted_parent_table中的行的永久删除应该级联到deleted_child_table。
https://dba.stackexchange.com/questions/13134
复制相似问题