MySQL联合多表更新和删除

摘要:
多表更新在MySQL 3.23中,您可以使用LIMIT#来确保只更改给定数量的记录行。从MySQL 4.0.4开始,您还可以运行包含多个表的UPDATE操作:UPDATEitems、monthSETitems。价格=月。priceWHERE项目。id=月份。身份证件;注意:多表UPDATE不能使用ORDER BY或LIMIT。如果使用ORDERBY子句,将按指定的顺序删除记录行。DELETE语句的LIMITrows选项是MySQL独有的。它告诉服务器在控制权返回给客户端之前可以删除的最大记录行数。但是,在多表删除中,不能使用ORDER BY或LIMIT。怎么写?SQL语句不支持同时更新多个表。
多表更新
在 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 特有的,它告诉server在控制权被返回到client之前可被删除的最大记录行数目。这能够用来确保一个特定的 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

免责声明:文章转载自《MySQL联合多表更新和删除》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇内嵌web浏览器SQL表分区之常规操作分区下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql批量更新

一般的update user set num = new_num where id = ('需更新的记录') ,这种一条条更新多条数据时会很慢,而采用下面的sql语句可以快速实现一条语句多条更新; UPDATE user SET name = CASE id WHEN 1 THEN new_num WHEN 2 THEN old_num + 10 WHEN...

mysql中alter命令的用法

MySQL的ALTER命令是非常有用的,当想改变表的名称,表的字段,或者如果要添加或删除一个现有的表中的列。 让我们开始创建一个表名为testalter_tbl的用例: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 root@host# mysql -u root -p password; En...

iostat磁盘监控工具

安装iostat磁盘监控工具 1、安装 yum install sysstat 2、运行 iostat -k -d -x 1 10 -k:以kb为单位统计 -d:显示磁盘状态 -x:显示详细信息 1:统计时间间隔为1秒 10:统计10次     rkb/s,wkb/s:每秒读写数据 await:每个IO请求等待时间 (ms),如果大于10MS,则性能不佳...

mysql驱动与数据库及jdk各版本对应关系

mysql驱动与jdk版本还有着一定的关系,经现场实测及搜索资料,记录如下: 应用JDK版本1.5  测试环境MySQL版本5.7 驱动版本5.1.40.jar  正常                             生产环境MySQL版本8.0 驱动版本5.1.40.jar  连接不上                             生产...

mysql表碎片清理和表空间收缩

一、表碎片清理 存储结构分析 MySQL5.5默认是共享表空间 ,5.6中默认是独立表空间(表空间管理类型就这2种) 独立表空间 就是采用和MyISAM 相同的方式, 每个表拥有一个独立的数据文件( .idb )1.每个表都有自已独立的表空间。 2.每个表的数据和索引都会存在自已的表空间中。 3.可以实现单表在不同的数据库中移动(将一个库的表移动到另一个库...

SQL中连接(JOIN)子句介绍

本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。 说明:本文的用法示例是面向 MySQL 数据库的。 1 概述SQL 中 JOIN 子句用于把来自两个或多个表的行结合起来。 在实际的数据库应用中,经常需要从多个数据表中读取数据,这时就可以使用 SQL 语句中的连...