- 第20章 更新和删除数据
- 一、更新数据
- 二、删除数据
- 三、更新和删除的指导原则
第20章 更新和删除数据
更新数据
删除数据
更新和删除的指导原则
一、更新数据
为了更新(修改)表中的数据,可使用update
语句。可采用两种方式使用update
:
※ 更新表中特定行; ※ 更新表中所有行。
下面分别对它们进行介绍。
不要省略where
子句在使用update
时一定要注意细心。因为稍不注意,就会更新表中所有行。在使用这条语句前,请完整地阅读本节。
update
与安全可以限制和控制update
语句的使用,更多内容请参见第28章。
update
语句非常容易使用,甚至可以说是太容易使用了。基本的update
语句由3部分组成,分别是:
※ 要更新的表; ※ 列名和它们的新值; ※ 确定要更新行的过滤条件。
举一个简单的例子。客户10005
现在有了电子邮件地址,因此他的记录需要更新,语句如下:
update customers
set cust_email = 'elmer@fudd.com'
where cust_id = 10005;
update
语句总是以要更新的表的名字开始。在此例子中,要更新的表的名字为customers
。set
命令用来将新值赋给被更新的列。如这里所示,set
子句设置cust_email
列为指定的值:
set cust_email = 'elmer@fudd.com'
update
语句以where
子句结束,它告诉MySQL更新哪一行。没有where
子句,MySQL将会用这个电子邮件地址更新customers
表中所有行,这不是我们所希望的。
更新多个列的语法稍有不同:
update customers
set cust_name = 'The Fudds',
cust_email = 'elmer@fudd.com'
where cust_id = 10005;
在更新多个列时,只需要使用单个set
命令,每个“列=值
”对之间用逗号分隔(最后一列之后不用逗号)。在此例子中,更新客户10005
的cust_name
和cust_email
列。
在update
语句中使用子查询update
语句中可以使用子查询,使得能用select
语句检索出的数据更新列数据。关于子查询及使用的更多内容,请参阅第14章。
ignore
关键字如果update
语句更新多行,并且在更新这些行中的一行或多行时出现一个错误,则整个update
操作被取消(错误发生前更新的所有行被恢复到它们原来的值)。为即使是发生错误,也继续进行更新,可使用ignore
关键字,如下所示:update ignore customers…
为了删除某个列的值,可设置它为NULL
(假如表定义允许NULL
值)。如下进行:
update customers
set cust_email = NULL
where cust_id = 10005;
其中NULL
用来去除cust_email
列中的值。
二、删除数据
为了从一个表中删除(去掉)数据,使用delete
语句。可以两种方式使用delete
:
※ 从表中删除特定的行; ※ 从表中删除所有行。
下面分别对它们进行介绍。
不要省略where
子句在使用delete
时一定要注意细心。因为稍不注意,就会错误地删除表中所有行。在使用这条语句前,请完整地阅读本节。
delete
与安全可以限制和控制delete
语句的使用,更多内容请参见第28章。
前面说过,update
非常容易使用,而delete
更容易使用。
下面的语句从customers
表中删除一行;
delete from customers
where cust_id = 10006;
这条语句很容易理解。delete from
要求指定从中删除数据的表名。where
子句过滤要删除的行。在这个例子中,只删除客户10006
。如果省略where
子句,它将删除表中每个客户。
delete
不需要列名或通配符。delete
删除整行而不是删除列。为了删除指定的列,请使用update
语句。
删除表的内容而不是表delete
语句从表中删除行,甚至是删除表中所有行。但是,delete
不删除表本身。
更快的删除如果想从表中删除所有行,不要使用delete
。可使用truncate table
语句,它完成相同的工作,但速度更快(truncate
实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。
三、更新和删除的指导原则
前一节中使用的update
和delete
语句全都具有where
子句,这样做的理由很充分。如果省略了where
子句,则update
或delete
将被应用到表中所有的行。换句话说,如果执行update
而不带where
子句,则表中每个行都将用新值更新。类似地,如果执行delete
语句而不带where
子句,表的所有数据都将被删除。
下面是许多SQL程序员使用update
或delete
时所遵循的习惯。
※ 除非确实打算更新和删除每一行,否则绝对不要使用不带where
子句的update
或delete
语句。 ※ 保证每个表都有主键(如果忘记这个内容,请参阅第15章),尽可能像where
子句那样使用它(可以指定各主键、多个值或值的范围)。 ※ 在对update
或delete
语句使用where
子句前,应该先用select
进行测试,保证它过滤的是正确的记录,以防编写的where
子句不正确。 ※ 使用强制实施引用完整性的数据库(关于这个内容,请参阅第15章),这样MySQL将不允许删除具有与其他表相关联的数据的行。
小心使用MySQL没有撤销按钮,应该非常小心地使用update
和delete
,否则你会发现自己更新或删除了错误的数据。
?