SQL 入门教程:删除数据(DELETE)

目录汇总:SQL 零基础入门教程

从一个表中删除(去掉)数据,使用 DELETE 语句。有两种使用 DELETE 的方式:

  • 从表中删除特定的行;
  • 从表中删除所有行。

下面分别介绍。

注意:不要省略 WHERE 子句

在使用 DELETE 时一定要细心。因为稍不注意,就会错误地删除表中所有行。在使用这条语句前,请完整地阅读本文。

提示:DELETE 与安全

在客户端/服务器的 DBMS 中,使用 DELETE 语句可能需要特殊的安全权限。在你使用 DELETE 前,应该保证自己有足够的安全权限。

前面说过,UPDATE 非常容易使用,而 DELETE 更容易使用。

下面的语句从 Customers 表中删除一行:

输入▼

1
2
DELETE FROM Customers
WHERE cust_id = 1000000006;

这条语句很容易理解。DELETE FROM 要求指定从中删除数据的表名,WHERE 子句过滤要删除的行。在这个例子中,只删除顾客 1000000006。如果省略 WHERE 子句,它将删除表中每个顾客。

提示:友好的外键

第 12 部分介绍了 联结,简单联结两个表只需要这两个表中的公用字段。也可以让 DBMS 通过使用外键来严格实施关系(这些定义在 样例表脚本 中)。

存在外键时,DBMS 使用它们实施引用完整性。例如要向 Products 表中插入一个新产品,DBMS 不允许通过未知的供应商 id 插入它,因为 vend_id 列是作为外键连接到 Vendors 表的。

那么,这与 DELETE 有什么关系呢?使用外键确保引用完整性的一个好处是,DBMS 通常可以防止删除某个关系需要用到的行。例如,要从 Products 表中删除一个产品,而这个产品用在 OrderItems 的已有订单中,那么 DELETE 语句将抛出错误并中止。这是总要定义外键的另一个理由。

提示:FROM 关键字

在某些 SQL 实现中,跟在 DELETE 后的关键字 FROM 是可选的。但是即使不需要,也最好提供这个关键字。这样做将保证 SQL 代码在 DBMS 之间可移植。

DELETE 不需要列名或通配符。DELETE 删除整行而不是删除列。要删除指定的列,请使用 UPDATE 语句。

说明:删除表的内容而不是表

DELETE 语句从表中删除行,甚至是删除表中所有行。但是,DELETE 不删除表本身。

提示:更快的删除

如果想从表中删除所有行,不要使用 DELETE。可使用 TRUNCATE TABLE 语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。

更新和删除的指导原则

前两节使用的 UPDATEDELETE 语句都有 WHERE 子句,这样做的理由很充分。如果省略了 WHERE 子句,则 UPDATEDELETE 将被应用到表中所有的行。换句话说,如果执行 UPDATE 而不带 WHERE 子句,则表中每一行都将用新值更新。类似地,如果执行 DELETE 语句而不带 WHERE 子句,表的所有数据都将被删除。

下面是许多 SQL 程序员使用 UPDATEDELETE 时所遵循的重要原则。

  • 除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE 子句的 UPDATEDELETE 语句。
  • 保证每个表都有主键(如果忘记这个内容,请参阅 联结),尽可能像 WHERE 子句那样使用它(可以指定各主键、多个值或值的范围)。
  • UPDATEDELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
  • 使用强制实施引用完整性的数据库(关于这个内容,请参阅 联结),这样 DBMS 将不允许删除其数据与其他表相关联的行。
  • 有的 DBMS 允许数据库管理员施加约束,防止执行不带 WHERE 子句的 UPDATEDELETE 语句。如果所采用的 DBMS 支持这个特性,应该使用它。

若是 SQL 没有撤销(undo)按钮,应该非常小心地使用 UPDATEDELETE,否则你会发现自己更新或删除了错误的数据。

请参阅

(完)

comments powered by Disqus