我可以使用一个查询更新两个相同的表 - MySQL

时间:2010-07-28 15:30:18

标签: mysql sql sql-update

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

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)。 这可能吗?

-Thanks

4 个答案:

答案 0 :(得分:2)

通过阅读mysql更新引用,它说:

  

对于多表语法,UPDATE   更新每个表中的行   table_references满足   条件。在这种情况下,ORDER BY和   LIMIT无法使用。

     

更新项目,月份SET   items.price = month.price WHERE   items.id = month.id;

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

答案 1 :(得分:2)

可以同时更新它们,但不能使用单个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

答案 2 :(得分:1)

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');

答案 3 :(得分:1)

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

但是,如果您使用的是关系数据库,则不应该有两个需要相同更新的表。一个驱动程序behing关系数据库是数据完整性,关系仅以一种方式保存..e / g /在这种情况下,如果id为3意味着值为c(或ch之后的z),则关系应仅保存在一个地方