/ 中存储网

MySQL中使用delete,update(left join)同时删除多个表内容

2014-07-13 16:33:44 来源:中存储网
普通的单表更新或删除sql大家肯定滚瓜烂熟,但你有用过连表更新或删除的sql吗, 这个在表间关联来做更新和删除操作非常有用. 本文分表介绍了如何用update ,delete做联表查询的方法, 先看mysql update对于联表更新的说明
--------------------------
如果一个UPDATE语句包
普通的单表更新或删除sql大家肯定滚瓜烂熟,但你有用过连表更新或删除的sql吗, 这个在表间关联来做更新和删除操作非常有用.
本文分表介绍了如何用update ,delete做联表操作的方法,

先看mysql update对于联表更新的说明
--------------------------
您也可以执行包括多个表的UPDATE操作。table_references子句列出了在联合中包含的表。该语法在13.2.7.1节,“JOIN语法”中进行了说明。以下是一个例子:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
以上的例子显示出了使用逗号操作符的内部联合,但是multiple-table UPDATE语句可以使用在SELECT语句中允许的任何类型的联合,比如LEFT JOIN。
注释:您不能把ORDER BY或LIMIT与multiple-table UPDATE同时使用。
在一个被更改的multiple-table UPDATE中,有些列被引用。您只需要这些列的UPDATE权限。有些列被读取了,但是没被修改。您只需要这些列的SELECT权限。
如果您使用的multiple-table UPDATE语句中包含带有外键限制的InnoDB表,则MySQL优化符处理表的顺序可能与上下层级关系的顺序不同。在此情况下,语句无效并被 回滚。同时,更新一个单一表,并且依靠ON UPDATE功能。该功能由InnoDB提供,用于对其它表进行相应的修改。请参见15.2.6.4节,“FOREIGN KEY约束”。
目前,您不能在一个子查询中更新一个表,同时从同一个表中选择。
---------------------------------------

举例说明:比如我现在有个主文章表,和一个文章附表,主文章表里存放一些文章的title,category分类,添加时间,和更新时间之类的基本信息,附文章表里放文章的内容.
我现在要更新主,附表里id为1的文章内容,我可以执行以下sql:
update a left join b on a.id=b.a_id set a.title='aaaaa',b.body='bbbb' where a.id=1

再看delete的联表删除
mysql手册中的描述
您可以在一个DELETE语句中指定多个表,根据多个表中的特定条件,从一个表或多个表中删除行。不过,您不能在一个多表DELETE语句中使用ORDER BY或LIMIT。
table_references部分列出了包含在联合中的表。此语法在13.2.7.1节,“JOIN语法”中进行了说明。
对于第一个语法,只删除列于FROM子句之前的表中的对应的行。对于第二个语法,只删除列于FROM子句之中(在USING子句之前)的表中的对应的行。作用是,您可以同时删除许多个表中的行,并使用其它的表进行搜索:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
或:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
当搜索待删除的行时,这些语句使用所有三个表,但是只从表t1和表t2中删除对应的行。
以上例子显示了使用逗号操作符的内部联合,但是多表DELETE语句可以使用SELECT语句中允许的所有类型的联合,比如LEFT JOIN。
本语法允许在名称后面加.*,以便与Access相容。
如果您使用的多表DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表进行处理,改变原来的从属关系。在这种情况下,该语句出现错误并返回到前面的步骤。要避免此错误,您应该从单一表中删除,并依靠InnoDB提供的ON DELETE功能,对其它表进行相应的修改。
注释:当引用表名称时,您必须使用别名(如果已给定):
DELETE t1 FROM test AS t1, test2 WHERE ...
进行多表删除时支持跨数据库删除,但是在此情况下,您在引用表时不能使用别名。举例说明:
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。
------------------------------------
现在我们还对刚才那二个表举例,删除主,附表里id为1的文章内容,我可以执行以下sql:
delete a,b from a left join b on a.id=b.a_id where a.id=1
注意我给加红的地方,如果你只删除多个表中的某个表里的数据,则在delete后面只跟那个表的名子,我举的例子是同时删除a和b中aid=1的数据,也就是同时删二个表的数据.
如图:
 
注:本文以是mysql来讲解的,其他的比如sql server ,access,oracle等也有他们各自不同的语法,用时请各位根据手册上的语法自自己摸索.