【MySQL】Delete,Update连表(left join)删除,更新语法

【MySQL】Delete,Update连表(left join)删除,更新语法php

您也能够执行包括多个表的UPDATE操做。table_references子句列出了在联合中包含的表。该语法在13.2.7.1节,“JOIN语法”中进行了说明。如下是一个例子:mysql

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同时使用。sql

 

在一个被更改的multiple-table UPDATE中,有些列被引用。您只须要这些列的UPDATE权限。有些列被读取了,可是没被修改。您只须要这些列的SELECT权限。数据库

 

若是您使用的multiple-table UPDATE语句中包含带有外键限制的InnoDB表,则MySQL优化符处理表的顺序可能与上下层级关系的顺序不一样。在此状况下,语句无效并被 回滚。同时,更新一个单一表,而且依靠ON UPDATE功能。该功能由InnoDB提供,用于对其它表进行相应的修改。请参见15.2.6.4节,“FOREIGN KEY约束”。优化

 

目前,您不能在一个子查询中更新一个表,同时从同一个表中选择。spa

 

---------------------------------------ip

举例说明:好比我如今有个主文章表,和一个文章附表,主文章表里存放一些文章的title,category分类,添加时间,和更新时间之类的基本信息,附文章表里放文章的内容.it

 

我如今要更新主,附表里id为1的文章内容,我能够执行如下sql:table

update a left join b on a.id=b.a_id set a.title='aaaaa',b.body='bbbb' where a.id=1www~phperz~com

再看delete的联表删除 www~phperz~com

mysql手册中的描述

您能够在一个DELETE语句中指定多个表,根据多个表中的特定条件,从一个表或多个表中删除行。不过,您不能在一个多表DELETE语句中使用ORDER BY或LIMIT。

 

table_references部分列出了包含在联合中的表。此语法在13.2.7.1节,“JOIN语法”中进行了说明。 www~phperz~com

对于第一个语法,只删除列于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功能,对其它表进行相应的修改。

 

注释:当引用表名称时,您必须使用别名(若是已给定): php程序员站

DELETE t1 FROM test AS t1, test2 WHERE ...
进行多表删除时支持跨数据库删除,可是在此状况下,您在引用表时不能使用别名。举例说明:phperz~com

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的数据,也就是同时删二个表的数据. php程序员

相关文章
相关标签/搜索