• MYSQL联合多表更新和删除(转)


    文章转自http://www.cnblogs.com/andy_tigger/archive/2011/05/11/2043483.html

    多表更新
    在 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
  • 相关阅读:
    API接口安全设计方案(已实现)
    第8篇-dispatch_next()函数分派字节码
    第7篇-为Java方法创建栈帧
    第6篇-Java方法新栈帧的创建
    第5篇-调用Java方法后弹出栈帧及处理返回结果
    第4篇-JVM终于开始调用Java主类的main()方法啦
    第3篇-CallStub新栈帧的创建
    第2篇-JVM虚拟机这样来调用Java主类的main()方法
    第1篇-关于JVM运行时,开篇说的简单些
    SpringCloud和SpringCloudAlibaba超详细总结
  • 原文地址:https://www.cnblogs.com/shuaiandjun/p/7267935.html
Copyright © 2020-2023  润新知