更新后加入MySQL查询无法正常工作

时间:2012-09-14 15:03:12

标签: mysql database

我已经尝试了使用以前问题的答案的这个更新查询的许多版本,但似乎无法让它工作。我最新的一个返回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记录?

2 个答案:

答案 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中被截断。