第十六课 更新和删除数据
#利用SQL的UPDATE和DELETE语句更新和删除数据
#使用UPDATE和DELETE语句更新和删除数据时可能存在的危险
#WHERE子句对UPDATE和DELETE语句的重要性
#为保证数据安全应遵循的指导原则
一、更新数据
#更新(或修改)表中的数据,可以使用UPDATE语句
#使用UPDATE的两种方式:
- 更新表中的特定行
- 更新表中的所有行
注意1:
不要省略WHERE子句:
#使用UPDATE时一定要细心。稍不注意,就会更新表中的所有行
注意2:
UPDATE与安全:
#在客户端/服务器的DBMS中,使用UPDATE语句可能需要特殊的安全权限
#使用UPDATE前,应该保证自己有足够的安全权限
基本的UPDATE语句由三个部分组成:
[1] - 要更新的表
[2] - 列名和它们的新值
[3] - 确定要更新哪些行的过滤条件
Customers表
【1】UPDATE customers SET cust_email = 'Kim@thetoystore.com' WHERE cust_id = '1000000005';
#客户1000000005的电子邮件地址记录需要更新
#UPDATE语句以要更新的表名开始,此例要更新的表名为customers
#SET命令用来将新值赋给被更新的列,此例SET子句设置cust_email列为指定的值
#UPDATE语句以WHERE子句结束,其告知DBMS更新哪一行
#没有WHERE子句,DBMS将会用这个电子邮件地址更新Customers表的所有行
【2】UPDATE customers SET cust_contact = 'Sam Roberts', cust_email = 'Sam@toyland.com' WHERE cust_id = '1000000006';
#更新多个列
#需要使用一条SET命令。每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)
#此列更新顾客1000000006的cust_contact和cust_email列
注意3:
在UPDATE语句中使用子查询:
#UPDATE语句可以使用子查询,使得能用SELECT语句检索出的数据更新列数据
注意4:
FROM关键字:
#有些SQL实现支持在UPDATE语句中使用FROM子句,用一个表的数据更新另一个表的行
要删除某个列的值,可设置它为NULL(假如表定义允许NULL值)
【3】UPDATE customers SET cust_email = NULL WHERE cust_id = '1000000005';
#NULL用来去除cust_email列中的值
#这与保存空字符串很不同(空字符串用‘ ’表示,是一个值)
#NULL表示没有值
二、删除数据
#从一个表中删除(去掉)数据,使用 DELETE语句
#使用DELETE的两种方式:
- 从表中删除特定的行
- 从表中删除所有行
注意5:
不要省略WHERE子句:
#使用DELETE时一定要细心。稍不注意,就会删除表中所有行
注意6:
UPDATE与安全:
#在客户端/服务器的DBMS中,使用DELETE语句可能需要特殊的安全权限
#使用DELETE前,应该保证自己有足够的安全权限
【4】DELETE FROM customers WHERE cust_id = '1000000006';
#从customers表中删除指定的行
#DELETE FROM要求指定从中删除数据的表名
#WHERE子句过滤要删除的行
#此例只删除顾客1000000006
#如果省略WHERE子句,它将删除表的每一行
使用外键确保引用完整性的一个好处是,DBMS通常可以防止删除某个关系需要用到的行,这是总要定义外键的理由之一。
注意7:
FROM关键字:
#在某些SQL实现中,跟在DELETE后的关键字FROM是可选的
#即使不需要,也最好提供这个关键字,保证SQL代码在DBMS之间的可移植性
注意8:
[1]DELETE不需要列名或通配符
[2]DELETE删除整行而不是删除列
[3]要删除指定的列,请使用UPDATE语句
注意9:
DELETE语句从表中删除行,甚至删除表中所有行,但是DELETE不删除表本身
注意10:
更快的删除表中所有行:
#从表中删除所有行,可用TRUNCATE TABLE语句
#TRUNCATE TABLE语句完成与DELETE相同的工作,速度更快
三、更新和删除的指导原则
使用UPDATE或DELETE时所遵循的重要原则:
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句
- 保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)
- 在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确
- 使用强制实施引用完整性的数据库,这样DBMS将不允许删除其数据与其他表相关联的行
- 有的DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的UPDATE或DELETE语句。如果所采用的DBMS支持这个特性,应该使用它
- 若是SQL没有撤销(undo)按钮,应该非常小心地使用UPDATE和DELETE,否则你会发现自己更新或删除了错误的数据
程序代码(DBMS:MySQL):
UPDATE customers
SET cust_email = 'Kim@thetoystore.com'
WHERE cust_id = '1000000005';
UPDATE customers
SET cust_contact = 'Sam Roberts',
cust_email = 'Sam@toyland.com'
WHERE cust_id = '1000000006';
UPDATE customers
SET cust_email = NULL
WHERE cust_id = '1000000005';
DELETE FROM customers
WHERE cust_id = '1000000006';
需要完整代码的小伙伴可关注微信公众号:菜田里守望者
打开微信扫一扫关注吧,你们的支持就是我的动力
参考文献:
【1】《SQL必知必会》第四版 人民邮电出版社 [美] Ben Forta 著 钟鸣 刘晓霞 译