在运行更新查询之前,您确定 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 中被截断。