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

       普通的单表更新或删除sql你们确定倒背如流,但你有用过连表更新或删除的sql吗, 这个在表间关联来作更新和删除操做很是有用. 本文分表介绍了如何用update ,delete作联表操做的方法, php程序员站 先看mysql update对于联表更新的说明php

-------------------------- mysql

--------------------------程序员

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

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

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

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

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

---------------------------------------blog

举例说明:好比我如今有个主文章表,和一个文章附表,主文章表里存放一些文章的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=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程序员站

如图:

 

注:本文以是mysql来说解的,其余的好比sql server ,access,oracle等也有他们各自不一样的语法,用时请各位根据手册上的语法自本身摸索. ph

相关文章
相关标签/搜索