3

これが私のテーブルです:

mysql> select * from t1;
+------+-------+
| id   | value |
+------+-------+
|    1 |     1 |
+------+-------+
1 row in set (0.00 sec)
mysql> select * from t2;
+------+-------+
| id   | value |
+------+-------+
|    1 |     2 |
|    1 |     1 |
|    1 |     2 |
|    1 |     3 |
+------+-------+
4 rows in set (0.00 sec)

次に、SQL を実行して、何らかの目的でテーブル t1 の日付を更新します。

mysql> update t1 join t2 on t1.id=t2.id  set t1.value=t2.value ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

そして今、変更を見てください:

 mysql> select * from t1;
+------+-------+
| id   | value |
+------+-------+
|    1 |     2 |
+------+-------+
1 row in set (0.00 sec)

一致した行の数が 1 である理由と、t1 の列の値が 3 ではなく id=1 の値である 2 であることはほとんど理解できません。最初の行に一致すると更新が停止しますか? この場合、t1 と t2 で完全なデータ一致が行われると思います。どんな助けでも大歓迎です!

アップデート

ありがとう、私が実際に扱っている状況は次のとおりです。

t2 の値については、',' で区切られたそれらを連結し、テーブル t1 の値に各 id でグループ化しますが、t1 の値のすべての要素は異なる必要があります。たとえば、上記のテーブル t1 と t2 のリストのように、更新操作の後、t1 の値は :"1,2,3" で、2 でも 3 でもありません。

関数 groupconcat() を使用すると、値を t1 の値と区別するのが難しくなります。

繰り返しますが、この場合のように行のみを更新するのは賢明ではないと思います。複数のテーブルにまたがる更新の場合、結合条件に一致するすべての行をループで 1 つずつ更新する必要があります。

4

2 に答える 2

0

なんて奇妙なクエリでしょう。MySQL は、同じ行を 4 回更新しないほど賢いようです。しかし、それ以外に、どのデータベースでも結果 (t1.value の新しい値) は定義されていません。必ず 1 行の値で更新するか、集計関数 (min、max など) を使用するようにしてください。

于 2013-10-09T08:06:21.730 に答える