您还可选取基于非索引列的行,如下例所示:
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 语句。
在 并发和锁定 之下讨论解决此问题的方法,
且在 对多
用户环境编程 中讨论得更详细。
您可能遇到的另一个问题是,在该语句完成之前出现硬件或软件故障。在此情况下,数据
库可能还没删除行,可能已删除了一些行,或已经删除了所有指定的行。数据库的状态未
知,这是我们不想看到的。要防止此情况,请使用事务日志记录,如 中断了的修改 讨论的
那样。
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 162 -