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

我可以用一个查询更新两个相同的表吗?MySQL,mysql,sql,sql-update,Mysql,Sql,Sql Update,我可以用一个查询更新两个相同的表吗 TABLEA _____________________________ | id | value | |_____________|_____________| | 1 | a | | 2 | b | | 3 | c | | 4 | d | | 5

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

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',其中id=3
)。 这可能吗


-感谢阅读mysql更新参考资料,它说:

对于多表语法,请更新 更新中命名的每个表中的行 表_满足以下条件的引用: 条件在本例中,按和进行订购 无法使用限制

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


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

对于多表语法,请更新 更新中命名的每个表中的行 表_满足以下条件的引用: 条件在本例中,按和进行订购 无法使用限制

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

MySQL支持使用以下语法:

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');
MySQL支持使用以下语法:

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

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

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

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


但是,如果您使用的是关系数据库,则不应该有两个需要相同更新的表。关系数据库的一个驱动因素是数据完整性,即一个关系只能以一种方式保存。例如,在这种情况下,如果id为3表示值为c(或在一个更改后为z),则关系只能保存在一个位置

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



但是,如果您使用的是关系数据库,则不应该有两个需要相同更新的表。关系数据库的一个驱动因素是数据完整性,即关系仅以一种方式保持。例如/g/在这种情况下,如果id为3意味着值为c(或一个字符后的z),则关系应仅保持在一个位置

您使用的是什么DBMS??数据库是MySQL,语言是PHPSorry,没有注意到标题。添加了
mysql
标签。您使用的是什么数据库管理系统??数据库是MySQL,语言是PHPSorry,没有注意到标题。添加了
mysql
标记。我知道-我没有设计数据库:-)我知道-我没有设计数据库:-)嗨,谢谢你的回答-解决方案比提供的查询更简单。我在问题的标题中提到了MySQL:-)@calumbrodie:我可以发誓我在某处看到了,但是当我回去检查时,我没有一直提到标题…嗨,谢谢你的回答-解决方案甚至比提供的查询更简单。我在问题的标题中提到了MySQL:-)@calumbrodie:我可以发誓我在什么地方看到过,但当我回去检查时,我并没有一直提到标题…在你的第一个答案之后我自己到了那里-非常简单-谢谢你的快速回复。只是注意到不是你提供了第一个答案-我已经将你的答案标记为正确,因为你给出了第一个完整的解决方案@Frabiaca感谢链接-我自己用正确的一行从文件。我觉得MySQL文档不是最容易阅读的(格式很差):-)是的,比我快44秒。。。我用另一种解决方案更新了我的答案,作为“谢谢”感谢您接受我的回答:)在您的第一个答案之后,我自己到达了那里-非常简单-感谢您的快速回复。只是注意到不是您提供了第一个答案-我已将您的答案标记为正确,因为您给出了第一个完整的解决方案@Frabiaca感谢链接-我用正确的行从文档我觉得MySQL文档不是最容易阅读的(格式很差):-)是的,比我快44秒。。。我用另一种解决方案更新了我的答案,作为接受我的答案的“谢谢:)谢谢文档中的这个片段-我找不到它谢谢文档中的这个片段-我找不到它