我想基于另一个表更新我的表中的字段,我在下面执行了这个查询,但我认为这不对..看起来它有效但是它是否正确?有什么情况可能会失败吗?
UPDATE users SET page = (SELECT page_name FROM pages WHERE user_id = id)
我的表USERS有一个列ID和页面。我的表PAGES有一个列page_name和user_id。上面的代码是对的吗?
答案 0 :(得分:1)
而不是subselect在mysql中你可以使用UPDATE JOIN
UPDATE users
INNER JOIN pages on pages.user_id = users.id
SET users.page = pages.page_name
答案 1 :(得分:1)
如果每个user_id的页面有多个page_name,则可能会失败。我发现UPDATE a INNER JOIN b ON some_conditions SET a.fieldA = b.fieldB;
更具可读性。它确实具有相同的故障情况,并且可能更难以“修复”此类情况;但相关的子查询(您的版本)往往会明显变慢。
另外,样式注释UPDATE users AS u SET u.page = (SELECT p.page_name FROM pages AS p WHERE p.user_id = u.id);
将消除对最后两句话的需要(更重要的是):
id
字段添加到pages
,则查询不会中断。答案 2 :(得分:1)
每当查询中有多个表时,应始终使用限定列名 - 最好是别名。因此,您的查询版本将是:
UPDATE users u
SET page = (SELECT p.page_name FROM pages p WHERE p.user_id = u.id);
接下来,您必须考虑子查询是否可能返回多行。如果是这样,您必须将其限制为一行。有各种方法,SELECT MAX(p.page_name)
,LIMIT 1
和SELECT GROUP_CONCAT(p.page_name)
都会浮现在脑海中。
接下来,您要更新users
中的所有行。如果您只想更新匹配的行,则可以使用IN
子句中的EXISTS
或WHERE
继续子查询路径。或者,使用JOIN
:
UPDATE users u JOIN
pages p
ON p.user_id = u.id
SET u.page = p.page_name;
但最重要的是,问一下存在问题:你为什么需要做这个更新?你有两个表之间的链接。使用链接而不是存储名称:
select u.*, p.page_name
from users u left join
pages p
on p.user_id = u.id;
答案 3 :(得分:-1)
您可以使用以下示例SQL并根据您的要求进行更改。上面的代码似乎是正确的。请您粘贴错误
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);