更新クエリを実行する前に、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 の列 'user' に対して調整された範囲外の値」) を発行しますが、それ以外の場合はクエリを成功させます。クエリを再度実行すると、値がまだ異なることが示されますが、実際に 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 と integer に格納できるデータの不一致は、データが table_1 で切り捨てられたことを意味します。