我可以用一个查询更新两个相同的表吗?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秒。。。我用另一种解决方案更新了我的答案,作为接受我的答案的“谢谢:)谢谢文档中的这个片段-我找不到它谢谢文档中的这个片段-我找不到它