一个特殊的假期留在家里一日三餐接受投喂,还瘦了五六斤。终于恢复到有网有机子的状态,所以学习整理工作恢复,心态上要调整好。只有不断练习深入,才能够专精,数据库要继续跟完。
所以今天跟的第16课主要讲的是数据的更新与删除:
目录
16.1 更新数据
16.2 删除数据
16.3 更新和删除的指导原则
首先,更新修改表中数据,用的是UPDATE语句,有两种方式,通过更新表中特定行、更新表中的所有行。
WHERE子句的省略问题,关系到是否更新表中所有行;UPDATE还有安全权限问题,在客户端或服务器的DBMS中,使用UPDATE语句可能需要特殊的安全权限。
UPDATE语句的组成(要更新的表/列名和对应新值/确定要更新哪些行的过滤条件)
让我们试试这个用法,将顾客表中顾客编号为1000000005的顾客邮箱更新:
UPDATE Customers SET cust_email = '[email protected]' WHERE cust_id = '1000000005';
如果没有WHERE子句后面跟的约束条件,那么DBMS会执行Customers表中的所有行,那就惨了!
更新多列的话,需要这样做:
UPDATE Customers SET cust_contact = 'Sam Roberts', cust_email = '[email protected]' WHERE cust_id = '1000000006';
为什么会有两种结果,因为之前在台式机上完成,customers表都已经测试新增到了8,而这张表示回来后按照最新的插入数据操作的。所以只有五条数据,而对于第六条顾客信息的更新,当然,行匹配结果为0,修改失败了。
在手动添加编号六的顾客信息后再执行一次上面代码,就修改成功了。
关于子查询的问题,可以使用子查询。
还有FROM关键字,是否支持得看DBMS是否支持,在文档中有,可以去看。
再来一个练习,我们尝试一下删除(假定表定义允许NULL的情况哈):
UPDATE Customers SET cust_email = NULL WHERE cust_id = '1000000005';
NULL就是去除cust_email列中值的作用,和我们空字符串(" ",是一个值)不同,NULL没值。
删除用DELETE语句,有两种,删除特定行,删除所有行。
WHERE子句省略的问题,别不小心省略了,因为没了WHERE,仔细想一想,不就是删除所有行吗?!包括安全权限问题,有就可以用没有是用不了删除的。
走个例子:
DELETE FROM Customers WHERE cust_id = '1000000006';
可以看到,确实删除了找到的一行记录。
这里引入一个外键,简单联结两个表只需要这两个标准公用字段,也可以让DBMS使用外键来实施关系(引用完整性)。
例如这段,我直接引用了书上原文:
例如要向Products表中插入一个新产品,DBMS不允许通过未知的供应商id插入它,因为vend_id列是作为外键连接到Vendors表的。那么,这与DELETE有什么关系呢?使用外键确保引用完整性的一个好处是,DBMS通常可以防止删除某个关系需要用到的行。例如,要从Products表中删除一个产品,而这个产品用在OrderItems的已有订单中,那么DELETE语句将抛出错误并中止。这是总要定义外键的另一个理由。
为了保证SQL代码的可移植性,最好把后面的FROM带上,不要轻易省略。
DELETE不需要列名或者通配符,删除整行而不是列,如果删除列的话,还是用UPDATE语句吧。
删除的是表的内容,可以删所有行,但是不删表本身!
如果觉得不够快,可以使用TRUNCATE TABLE语句删除,因为不记录数据的变动,也删除所有行。
带WHERE就是后接约束条件,不带就是操作针对所有行。
那么我们在使用这两种操作时,必须要遵循以下几点:
□ 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
□ 保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
□ 在UPDATE/DELETE语句使用WHERE子句前,先用SELECT测试,保证过滤的是正确记录,以防编写的WHERE子句不正确。
□ 使用强制实施引用完整性的数据库,这样DBMS将不允许删除其数据与其他表相关联的行。
□ 有的DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的UPDATE或DELETE语句。如果所采用的DBMS支持这个特性,应该使用它。若是SQL没有撤销(undo)按钮,应该非常小心地使用UPDATE和DELETE,否则你会发现自己更新或删除了错误的数据。
这部分就学习完了,本来是要在3号完成的,一天的时光过于短暂,又过的飞快。在我睁眼闭眼间,天已经转换到第二天。既然这样,就不坚持完成两部分的学习,跟完这一课,明天继续。
还是那句鼓励自己的老话!
刻意练习,每日精进。加油~小伙伴们!还有偶有沮丧,一直治愈!