1. ホーム
  2. mysql

[解決済み] MySQLのあるテーブルを別のテーブルの値で更新する

2022-12-06 03:41:23

質問

ある MySQL テーブルを、別のテーブルからの情報に基づいて更新しようとしています。

私の original テーブルは次のようになります。

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

そして、その tobeupdated テーブルは次のようになります。

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

を更新したい idtobeupdated と共に id から original をベースに value (に格納されている文字列)。 VARCHAR(32) フィールドに格納された文字列)。

更新されたテーブルは、うまくいけば次のようになります。

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

動作するクエリを持っていますが、非常に遅いです。

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

これはCPUを最大にし、最終的には更新のほんの一部しか実行されずにタイムアウトになります(マッチする値は数千個あります)。私は、マッチングを value でマッチングすると遅くなることは分かっていますが、これは私が持っている唯一のデータであり、それらを一緒にマッチングさせることができます。

このような値を更新する良い方法はありますか?もしその方が速いのであれば、マージされた結果のために3番目のテーブルを作成することができますか?

私は MySQL - 別のテーブルからの値でテーブルを更新するにはどうすればよいですか? を試してみましたが、それは本当に助けになりませんでした。何かアイデアはありますか?

MySQL 初心者を助けていただき、ありがとうございます。

どのように解決するのですか?

UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

これで、あなたのものと全く同じことができるはずです。しかし、私は複数の「WHERE」条件よりも「JOIN」構文の方が読みやすいと思います。

動作が遅いということですが、テーブルの大きさはどのくらいですか?インデックスを tobeupdated.valueoriginal.value

EDIT また、クエリを簡略化することができます。

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USING は、結合の両方のテーブルが同じ名前の key のように id つまり、等位結合 http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join