45it.com- 电脑学习从此开始!
diy硬件教程攒机经验装机配置
设计photoshop网页设计特效
系统注册表dos系统命令其它
存储主板显卡外设键鼠内存
维修显卡cpu内存打印机
winxpvistawin7unix/linux
cpu光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公excelwordpowerpointwps
编程数据库css脚本php
网络局域网qq服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > 数据库 >

mysql联合多表更新和删除

电脑软硬件应用网 45it.com 时间:2016-08-19 10:16 作者:佚名
多表更新 在 mysql 3.23 中,你可以使用 limit # 来确保只有给定的记录行数目被更改。 如果一个 order by 子句被使用(从 mysql 4.0.0 开始支持),记录行将以指定的次序被更新。这实际上只有连同 limit 一起才有用。
多表更新
在 mysql 3.23 中,你可以使用 limit # 来确保只有给定的记录行数目被更改。

如果一个 order by 子句被使用(从 mysql 4.0.0 开始支持),记录行将以指定的次序被更新。这实际上只有连同 limit 一起才有用。

从 mysql 4.0.4 开始,你也可以执行一个包含多个表的 update 的操作:

update items,month set items.price=month.price
where items.id=month.id;

注意:多表 update 不可以使用 order by 或 limit。



多表删除
第一个多表删除格式从 mysql 4.0.0 开始被支持。第二个多表删除格式从 mysql 4.0.2 开始被支持。

仅仅在 from 或 using 子句 之前 列出的表中的匹配记录行被删除。效果就是,你要以从多个表中同时删除记录行,并且同样可以有其它的表用于检索。

在表名后的 .* 仅仅是为了兼容 access:

delete t1,t2 from t1,t2,t3 where t1.id=t2.id and t2.id=t3.id

or

delete from t1,t2 using t1,t2,t3 where t1.id=t2.id and t2.id=t3.id

在上面的情况下,我们仅仅从 t1 和 t2 表中删除匹配的记录行。

如果一个 order by 子句被使用(从 mysql 4.0.0 开始支持), 记录行将以指定的次序删除。这实际上只有连同 limit 一起才有用。示例如下:

delete from somelog
where user = 'jcole'
order by timestamp
limit 1

这将删除匹配 where 子句的,并且最早被插入(通过 timestamp 来确定)的记录行。

delete 语句的limit rows 选项是 mysql 特有的,它告诉服务器在控制权被返回到客户端之前可被删除的最大记录行数目。这可以用来确保一个特定的 delete 命令不会占用太长的时间。你可以简单地重复使用 delete 命令,直到被影响的记录行数目小于 limit 值。

从 mysql 4.0 开始,在 delete 语句中可以指定多个表,用以从一个表中删除依赖于多表中的特殊情况的记录行。然而,在一个多表删除中,不能使用 order by 或 limit。
假设有两个表,tab1,tab2,分别有产品名称和产品价格,现在我想用tab2的价格替换tab1的价格,我写的语句是update tab1 set tab1.产品价格=tab2.产品价格 where tab1.产品名称=tab2.产品名称
结果出现错误,提示为:列前缀 'tab2' 与查询中所用的表名或别名不匹配。请问应该怎样写,

sql语句是不支持多表同时更新的。

应该这样写

update tab1 set tab1.产品价格 = (select tab2.产品价格 from tab2 where tab2.产品名称 = tab1.产品名称) where tabl1.产品名称 in (select tab2.产品名称 from tab2)


后面的where tab1.产品名称 in (select tab2.产品名称 from tab2) 这句保证了如果tab1的产品在tab2没有记录时不会出错。


在 开发中,数据库来回换,而有些关键性的语法又各不相同,这是一件让开发人员很头痛的事情.本文总结了update语句更新多表时在sql server,oracle,mysql三种数据库中的用法.我也试了sqlite数据库,都没成功,不知是不支持多表更新还是咋的.

在本例中:

我们要用表gdqlpj中的gqdltks,bztks字段数据去更新landleveldata中的同字段名的数据,条件是当landleveldata 中的geo_code字段值与gdqlpj中的lxqdm字段值相等时进行更新.

sql server语法:
update
{
table_name with ( < table_hint_limited > [ ...n ] )
| view_name
| rowset_function_limited
}
set
{ column_name = { expression | default | null }
| @variable = expression
| @variable = column = expression } [ ,...n ]

{ { [ from { < table_source > } [ ,...n ] ]

[ where
< search_condition > ] }
|
[ where current of
{ { [ global ] cursor_name } | cursor_variable_name }
] }
[ option ( < query_hint > [ ,...n ] ) ]

sql server示例:
update a
set a.gqdltks=b.gqdltks,a.bztks=b.bztks
from landleveldata a,gdqlpj b
where a.geo_code=b.lxqdm

oracle语法:
update updatedtable
set (col_name1[,col_name2...])=
(select col_name1,[,col_name2...]
from srctable [where where_definition])

oracel 示例:
update landleveldata a
set (a.gqdltks, a.bztks)=
(select b.gqdltks, b.bztks from gdqlpj b
where a.geo_code=b.lxqdm)

mysql语法:
update table_references
set col_name1=expr1 [, col_name2=expr2 ...]
[where where_definition]

mysql 示例:
update landleveldata a, gdqlpj b
set a.gqdltks= b.gqdltks,
a.bztks= b.bztks
where a.geo_code=b.lxqdm
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识