结构化查询语言/DELETE 2
外观
< 结构化查询语言
提示:请小心并禁用 AUTOCOMMIT.
因为 DELETE 命令删除整行而不是部分行,所以语法很简单。其结构在 上一页 中展示过。本页只增加了一点:WHERE 子句不仅限于简单的条件,如 'id = 10',还可以包含子查询。这使得命令更加灵活。
在 DELETE 命令中使用子查询与在 UPDATE 或 SELECT 命令中使用子查询相同。
还有另一个删除行的命令。 TRUNCATE 命令与 DELETE 非常相似。TRUNCATE 删除表的 所有 行,并且性能更好。但是它没有机制来选择单个行。
该示例命令删除出生在旧金山的联系人的信息。
-- Delete rows depending on a criteria which resides in a different table.
DELETE FROM contact
WHERE person_id IN
(SELECT id
FROM person
WHERE place_of_birth = 'San Francisco'
);
-- It's only a test. Restore the rows.
ROLLBACK;
相关子查询与 DELETE 命令的组合不被所有实现支持。
DBMS 通常会拒绝 DELETE 命令,因为外键约束将在执行期间被违反。例如:如果命令尝试删除已知联系人或爱好信息的个人,该命令将失败(整体失败)。为了克服这种情况,有几种不同的策略:
- 在删除目标行之前删除所有依赖行。
- 将外键约束定义为 DEFERRED(在 COMMIT 之前不会检查),并在目标行之前或之后删除依赖行。
- 将外键约束定义为 CASCADE。在这种情况下,依赖行将被自动删除。
删除 Goldstein 家族的爱好信息。
点击查看答案
DELETE FROM person_hobby
WHERE person_id IN
(SELECT id
FROM person
WHERE lastname = 'Goldstein'
);
-- Refrain from deleting the hobby itself - because:
-- a) The hobby may be allocated to a different person.
-- b) After the information in person_hobby is deleted, there is no longer the possibility to get
-- to old assignment between person and hobby.
-- It's only a test. Restore the rows.
ROLLBACK;