第16课 更新和删除数据
这一课介绍如何利用UPDATE
和DELETE
语句进一步操作表数据。
16.1 更新数据
有两种使用UPDATE
的方式:
- 更新表中的特定行
- 更新表中的所有行
注意:不要省略
WHERE
子句
- 因为稍不注意,就会更新表中的所有行。
基本的UPDATE
语句由三部分组成,分别是:
- 要更新的表;
- 列名和它们的值;
- 确定要更新哪些行的过滤条件;
SET
命令用来将新值赋给被更新的列。
在更新多个列时,只需要使用一条SET
命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。
提示:在
UPDATE
语句中使用子查询
UPDATE
语句中可以使用子查询,使得能用SELECT
语句检索出的数据更新列数据。提示:
FROM
关键字有的
SQL
实现支持在UPDATE
语句中使用FROM
子句,用一个表的数据更新另一个表的行。
16.2 删除数据
有两种使用DELETE
的方式:
- 从表中删除特定的行;
- 从表中删除所有行。
提示:友好的外键
第12课介绍了联结,简单联结两个表只需要这两个表中的公用字段。也可以让
DBMS
通过使用外键来严格实施关系(这些定义在附录A中)。存在外键时,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
语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。
16.3 更新和删除的指导原则
使用UPDATE
或DELETE
时所遵循的重要原则。
- 除非确实打算更新和删除每一行,否则绝对不要使用不带
WHERE
子句的UPDATE
或DELETE
语句。 - 保证每个表都有主键(如果忘记这个内容,请参阅第12课),尽可能像
WHERE
子句那样使用它(可以指定各主键、多个值或值的范围)。 - 在
UPDATE
或DELETE
语句使用WHERE
子句前,应该先用SELECT
进行测试,保证它过滤的是正确的记录,以防编写的WHERE
子句不正确。 - 使用强制实施引用完整性的数据库(关于这个内容,请参阅第12课),这样
DBMS
将不允许删除其数据与其他表相关联的行。 - 有的
DBMS
允许数据库管理员施加约束,防止执行不带WHERE
子句的UPDATE
或DELETE
语句。如果所采用的DBMS
支持这个特性,应该使用它。
若是SQL
没有撤销(undo
)按钮,应该非常小心地使用UPDATE
和DELETE
,否则你会发现自己更新或删除了错误的数据。