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

问题描述:

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

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

+0

你正在使用哪些DBMS? – 2010-07-28 15:31:13

+1

? DB是MySQL,语言是PHP – calumbrodie 2010-07-28 15:37:40

+0

对不起,没有注意到标题。添加了'mysql'标签。 – 2010-07-28 15:40:18

MySQL的使用下面的语法支持multiple-table updates

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:

如果你不喜欢重复你要设定值的两倍,您可能需要使用下面的技巧:

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

在您的第一个答案后自己到达那里 - 非常简单 - 感谢您的快速响应。 – calumbrodie 2010-07-28 15:43:26

+0

只是注意到这不是你谁提供了第一个答案 - 我已经标记你的anser是正确的,因为你给了第一个完整的解决方案 @frabiacca 感谢您的链接 - 我想出了自己与正确的线文档。我没有发现MySQL文档最容易阅读(糟糕的格式):-) – calumbrodie 2010-07-28 15:45:30

+0

是的,[@frabiacca](http://*.com/questions/3354507/can-i-update-two-identical-tables -in-with-one-query-mysql/3354572#3354572)打败了我44秒......我用另一个解决方案更新了我的答案,作为“谢谢”接受我的答案:) – 2010-07-28 15:47:21

通过读取mysql的更新的参考,它说:

对于多表语法,在 table_references满足 条件命名为每个表更新 更新行。在这种情况下,不能使用ORDER BY和 LIMIT。

UPDATE items,month SET items.price = month.price WHERE items.id = month.id;

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

测试案例:

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

+0

感谢这篇文档中的代码片段 - 我无法找到它 – calumbrodie 2010-07-28 15:46:08

有可能在对其进行更新同一时间,但没有一个单一的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 
+0

嗨,谢谢你的回答 - 解决方案比提供的查询更简单。 我在问题的标题中陈述了MySQL :-) – calumbrodie 2010-07-28 15:41:58

+0

@calumbrodie:我可以发誓我看到了某个地方,但是当我回去检查时,我没有一路走到标题处。 – Allan 2010-07-28 15:53:05

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

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

+0

我意识到这一点 - 我没有设计数据库:-) – calumbrodie 2010-07-28 15:40:53