跳转到内容

结构化查询语言/DELETE 2

来自维基教科书,开放世界中的开放书籍



提示:请小心并禁用 AUTOCOMMIT.

因为 DELETE 命令删除整行而不是部分行,所以语法很简单。其结构在 上一页 中展示过。本页只增加了一点:WHERE 子句不仅限于简单的条件,如 'id = 10',还可以包含子查询。这使得命令更加灵活。

在 DELETE 命令中使用子查询与在 UPDATESELECT 命令中使用子查询相同。

还有另一个删除行的命令。 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;


华夏公益教科书