我可以使用一个查询更新两个相同的表吗?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
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');
在您的第一个答案后自己到达那里 - 非常简单 - 感谢您的快速响应。 – calumbrodie 2010-07-28 15:43:26
只是注意到这不是你谁提供了第一个答案 - 我已经标记你的anser是正确的,因为你给了第一个完整的解决方案 @frabiacca 感谢您的链接 - 我想出了自己与正确的线文档。我没有发现MySQL文档最容易阅读(糟糕的格式):-) – calumbrodie 2010-07-28 15:45:30
是的,[@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');
测试案例:
感谢这篇文档中的代码片段 - 我无法找到它 – 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
嗨,谢谢你的回答 - 解决方案比提供的查询更简单。 我在问题的标题中陈述了MySQL :-) – calumbrodie 2010-07-28 15:41:58
@calumbrodie:我可以发誓我看到了某个地方,但是当我回去检查时,我没有一路走到标题处。 – Allan 2010-07-28 15:53:05
大多数RDBMS只允许您在一张表上直接插入,更新或删除。如果你有外键和级联,那么一些插入和删除可以在多个表上执行
但是,如果你使用的是关系数据库,你不应该有两个需要相同更新的表。一个驱动程序抛出关系数据库是数据完整性,关系只能以一种方式保存.e/g /在这种情况下,如果id为3意味着该值为c(或在一个chnage之后z),则该关系应该只保存在一个地方
我意识到这一点 - 我没有设计数据库:-) – calumbrodie 2010-07-28 15:40:53
你正在使用哪些DBMS? – 2010-07-28 15:31:13
? DB是MySQL,语言是PHP – calumbrodie 2010-07-28 15:37:40
对不起,没有注意到标题。添加了'mysql'标签。 – 2010-07-28 15:40:18