什么是假删除?
在实际开发中,我们经常会遇到需要删除数据的情况,但是在一些特殊的场景下,我们并不想真正地删除数据,而是希望将其标记为已删除状态,以便后续操作。
这种操作就被称为假删除,也叫软删除。
假删除实现方式
添加删除标记
实现假删除的最简单方式就是为数据表添加一个标记列,用来表示数据是否已经删除。当需要删除数据时,不是真的把数据从数据库中删除,而是将该标记列的值设置为已删除标记。在后续操作时,只查询未被删除标记的数据。
ALTER TABLE 表名 ADD COLUMN delete_flag INT DEFAULT 0
UPDATE 表名 SET delete_flag=1 WHERE 条件
SELECT * FROM 表名 WHERE delete_flag=0
在上面的示例中,我们在"表名"这个表中添加了一个"delete_flag"列,并将初始值设置为0。当需要删除数据时,将"delete_flag"的值设置为1;查询数据时,只查询"delete_flag"值为0的记录。
这种方式虽然简单,但是如果有多张表需要实现假删除功能,每张表都添加一个标记列会显得十分冗余。
使用逻辑删除触发器
使用删除标记的方式虽然简单,但是在多张表需要实现假删除功能时,每张表都添加一个标记列会显得十分冗余。
这个时候我们可以使用触发器来实现假删除功能,通过在删除操作执行前设置"delete_flag"值来实现该效果。当然,这需要我们在数据库中,写一个"before delete"类型的触发器,它将在删除操作执行前,将"delete_flag"值设置为已删除状态。
CREATE TRIGGER trigger_name
ON table_name
INSTEAD OF DELETE
AS
BEGIN
UPDATE table_name SET delete_flag=1 WHERE primaryKey IN(SELECT primaryKey FROM DELETED)
END
SELECT * FROM table_name WHERE delete_flag = 0
这个触发器的功能就是在执行实际的删除操作之前,将"delete_flag"列的值设置为1,同时在查询数据时,只查询"delete_flag"值为0的记录。
需要注意的是,每次查询数据时,都需要加上"delete_flag=0"的条件,以避免查询出已删除的数据。
假删除的优缺点
优点
数据并没有真正被删除,可以根据需要进行恢复操作。
避免了数据误删除的情况,提高了数据的安全性。
对于大型数据库的数据,假删除可以提高删除操作的效率。
缺点
需要增加额外的列或者写触发器,增加了代码的复杂度。
由于数据并没有真正被删除,会占用存储空间,当数据量较大时,可能会导致存储空间占满。
对于需要强制删除数据的场景,假删除无法实现。
因此,在实际开发中,需要根据具体场景选择是否使用假删除功能。