删除选择了的行

您还可选取基于非索引列的行,如下例所示:
DELETE FROM customer WHERE company = 'Druid Cyclery';

由于被测试的列没有唯一约束,因此此语句可能删除多行。(Druid Cyclery 可能有两个商店,两个商店的名称相同但客户编号不一样。)

要了解 DELETE 语句影响多少行,请从 customer 表中为 Druid Cyclery 选择符合条件的行计数。
SELECT COUNT(*) FROM customer WHERE company = 'Druid Cyclery';

您还可选择这些行并显示它们,以确保它们是您想要删除的那些行。

然而,当数据库对于多个用户同时可用时,使用 SELECT 语句作为测试只是一种近似的方法。在您执行 SELECT 语句与后续的 DELETE 语句之间的时间内,其他用户可能已修改了该表并更改了结果。在此示例中,另一用户可能执行下列操作:
  • 为名为 Druid Cyclery 的另一客户插入新行
  • 在插入新行之前,删除一个或多个 Druid Cyclery 行
  • 更新 Druid Cyclery 行以具有新的公司名称,或更新某个其他客户以具有名称 Druid Cyclery。

在这短短的时间间隔内,虽然其他用户不太可能执行这些操作,但确实存在这种可能性。相同的问题也影响 UPDATE 语句。在 并发和锁定 之下讨论解决此问题的方法,且在 对多用户环境编程 中讨论得更详细。

您可能遇到的另一个问题是,在该语句完成之前出现硬件或软件故障。在此情况下,数据库可能还没删除行,可能已删除了一些行,或已经删除了所有指定的行。数据库的状态未知,这是我们不想看到的。要防止此情况,请使用事务日志记录,如 中断了的修改 讨论的那样。