普通的单表更新或删除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