我已经尝试了使用以前问题的答案的这个更新查询的许多版本,但似乎无法让它工作。我最新的一个返回0行受影响。
当我运行此查询(这是我想要的)时,我得到2017年的结果
SELECT *
FROM table_1 t1
INNER JOIN table_2 t2 ON t1.company = t2.company
WHERE t1.user = 123 AND t2.group_id = 3
但我想运行像这样的更新查询
UPDATE table_1 AS t1
INNER JOIN table_2 as t2
ON t1.company = t2.company
SET t1.user = t2.user
WHERE t1.user = 123 AND t2.group_id = 3
但我受到0行的影响
为什么此更新查询不会更新查询1中返回的2017记录?
答案 0 :(得分:1)
我希望您的选择查询返回太多行,因为您有错误:
INNER JOIN table_2 t2 ON t2.company = t2.company
我想你想要:
INNER JOIN table_2 t2 ON t1.company = t2.company
答案 1 :(得分:0)
在运行更新查询之前,您确定table_1.user和table_2.user值实际上是不同吗? MySQL将报告实际更改的行数,而不是选择和检查的行数。
首先尝试运行此查询,以查看实际需要更新的2017行数:
SELECT *
FROM table_1 t1
INNER JOIN table_2 t2 ON t1.company = t2.company
WHERE t1.user = 123 AND t2.group_id = 3
AND t1.user <> t2.user
事实证明,如果数据类型足够相似以进行比较,则会发生这种情况,但不足以将table_2.user中的值分配给table_1.user。在这种情况下,MySQL将发出警告(“在行xxx处为列'用户'调整超出范围值”),否则将允许查询成功。再次运行查询将显示值仍然不同,但不会更改t1.user中实际存储的值。
如果您修改更新查询以仅匹配需要更改的行,并从命令行运行,那么MySQL将告诉您具体发生了什么:
mysql> UPDATE table_1 AS t1
-> INNER JOIN table_2 as t2
-> ON t1.company = t2.company
-> SET t1.user = t2.user
-> WHERE t1.user = 123 AND t2.group_id = 3
-> AND t1.user <> t2.user
Query OK, 0 rows affected, 2017 warnings (0.01 sec)
Rows matched: 2017 Changed: 0 Warnings: 2017
Rows matched: 2017
表示需要更新2017行(如果值已经正确,则为0)
Changed: 0
表示尽管有SET t1.user = t2.user
命令,但它们中没有一个实际上以不同的值结束。
Warnings: 2017
说出了问题,你应该发出一个SHOW WARNINGS
查询来查明它是什么。在这种情况下,可以存储在smallint和整数之间的差异意味着数据在table_1中被截断。