提示:注意并关闭 AUTOCOMMIT

由于 DELETE 命令会整行删除数据,而不是部分删除,其语法非常简单。在之前的页面中已经展示了它的基本结构。当前页面提供了一个补充说明:WHERE 子句不仅可以包含简单条件(例如 id = 10),还可以包含子查询,这极大地增强了 DELETE 命令的灵活性。

子查询作为 DELETE 命令的一部分,其用法与在 UPDATESELECT 命令中的使用方式完全一致。

此外,还有另一个用于删除行的命令:TRUNCATE。与 DELETE 类似,TRUNCATE删除表中的所有行,但性能更高。然而,TRUNCATE 不支持选择特定行。


示例

以下示例删除出生地为 San Francisco 的人的联系方式:

-- 根据不同表中的条件删除行
DELETE FROM contact
WHERE  person_id IN
  (SELECT id
   FROM   person
   WHERE  place_of_birth = 'San Francisco'
  );

-- 只是测试,恢复数据
ROLLBACK;

请注意,并非所有数据库实现都支持与 DELETE 命令结合使用的相关子查询。


外键约束的注意事项

执行 DELETE 命令时,可能会因为外键约束(Foreign Key constraints)的限制而失败。例如,如果尝试删除某个有联系方式或爱好记录的用户,该命令会整体失败。

为了解决这些问题,可以采取以下策略:

  1. 提前删除依赖的行
    在删除目标行之前,先删除所有依赖的行。

  2. 外键约束设置为延迟检查(DEFERRED)
    外键约束检查将延迟到事务提交时(COMMIT),这样可以在删除目标行前后删除相关的依赖行。

  3. 外键约束定义为级联删除(CASCADE)
    在这种情况下,依赖的行会在目标行删除时自动被删除。

最后修改: 2025年01月28日 星期二 13:32