代码之家  ›  专栏  ›  技术社区  ›  calumbrodie

我能用一个查询更新两个相同的表吗-MySQL

  •  1
  • calumbrodie  · 技术社区  · 15 年前

    我可以用一个查询更新两个相同的表吗?

    TABLEA
    _____________________________
    |     id      |   value     |
    |_____________|_____________| 
    |      1      |      a      | 
    |      2      |      b      | 
    |      3      |      c      | 
    |      4      |      d      | 
    |      5      |      e      |    
    |_____________|_____________| 
    
    TABLEB
    _____________________________
    |     id      |   value     |
    |_____________|_____________| 
    |      1      |      a      | 
    |      2      |      b      | 
    |      3      |      c      | 
    |      4      |      d      | 
    |      5      |      e      |    
    |_____________|_____________| 
    

    我想更新这两个表( SET value = 'z' WHERE id=3 )同时。 这可能吗?

    -谢谢

    4 回复  |  直到 13 年前
        1
  •  1
  •   Daniel Vassallo    15 年前

    MySQL支持 multiple-table updates 使用以下语法:

    UPDATE tablea, tableb
    SET    tablea.value = 'z', tableb.value = 'z'
    WHERE  (tablea.id = tableb.id) AND (tablea.id = '3');
    

    测试用例:

    CREATE TABLE tablea (id int, value char(1));
    CREATE TABLE tableb (id int, value char(1));
    
    INSERT INTO tablea VALUES (1, 'a');
    INSERT INTO tablea VALUES (2, 'b');
    INSERT INTO tablea VALUES (3, 'c');
    INSERT INTO tablea VALUES (4, 'd');
    INSERT INTO tablea VALUES (5, 'e');
    
    INSERT INTO tableb VALUES (1, 'a');
    INSERT INTO tableb VALUES (2, 'b');
    INSERT INTO tableb VALUES (3, 'c');
    INSERT INTO tableb VALUES (4, 'd');
    INSERT INTO tableb VALUES (5, 'e');
    

    结果:

    SELECT * FROM tablea;
    +------+-------+
    | id   | value |
    +------+-------+
    |    1 | a     |
    |    2 | b     |
    |    3 | z     |
    |    4 | d     |
    |    5 | e     |
    +------+-------+
    5 rows in set (0.00 sec)
    
    SELECT * FROM tableb;
    +------+-------+
    | id   | value |
    +------+-------+
    |    1 | a     |
    |    2 | b     |
    |    3 | z     |
    |    4 | d     |
    |    5 | e     |
    +------+-------+
    5 rows in set (0.00 sec)
    

    如果不希望重复将要设置的值两次,则可能需要使用以下技巧:

    UPDATE tablea, tableb, (SELECT 'z' val) d
    SET    tablea.value = d.val, tableb.value = d.val
    WHERE  (tablea.id = tableb.id) AND (tablea.id = '3');
    
        2
  •  2
  •   frabiacca    15 年前

    通过阅读mysql update reference,它说:

    更新中名为的每个表中的行 条件。在这种情况下,按和排序 无法使用限制。

    更新项目,月集 items.price=month.price其中

    http://dev.mysql.com/doc/refman/5.0/en/update.html

        3
  •  2
  •   Allan    15 年前

    可以同时更新它们,但不能使用单个SQL语句(好吧,可以,但不建议这样做)。这几乎就是事务的全部要点:您单独更新每个表,但这些更改在提交之前不会生效。对于任何其他用户,表会同时更新。

    如果您确实坚持要在一条语句中同时更新这两个表,那么以下操作可能会起作用,但这取决于以ID作为主键的两个表,并且可能取决于您正在使用的特定RDBMS:

    update (select tablea.id, 
                   tablea.value v1, 
                   tableb.value v2 
            from tablea 
                 join tableb 
                 on tablea.id = tableb.id)
    set v1 = 'z'
    where id = 3
    
        4
  •  1
  •   mmmmmm    15 年前

    大多数RDBMS只允许您一次直接插入、更新或删除一个表。如果您有外键和级联,那么一些插入和代入可以放在多个表上