0

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

4

2 回答 2

1

我希望您的选择查询返回太多行,因为您有一个错误:

INNER JOIN table_2 t2 ON t2.company = t2.company

我想你想要:

INNER JOIN table_2 t2 ON t1.company = t2.company
于 2012-09-14T15:09:03.853 回答
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: 0SET t1.user = t2.user意味着尽管有命令,但它们实际上都没有最终得到不同的值。

Warnings: 2017说出现了问题,您应该发出SHOW WARNINGS查询以找出问题所在。在这种情况下,可以存储在 smallint 和整数中的内容之间的差异意味着数据在 table_1 中被截断。

于 2012-09-14T15:12:53.050 回答