SQLの多くのレコードを更新する高速な方法はありますか?
-
08-07-2019 - |
質問
20000を超える名前を、CodeIDを指定して作成した新しい名前に置き換える必要があります。
例:" dog"を含むすべての行を更新する必要があります(CodeIDが1である)を" cat"で処理し、" horse"を含むすべての行を更新します。 (CodeIDが2)に" bird"などが含まれています。
最初のSQLステートメント:UPDATE animalTable SET cDescription
=" cat" WHERE CodeID
= 1
2番目のSQLステートメント:UPDATE animalTable SET cDescription
=" bird" WHERE CodeID
= 2
これらのステートメントは機能しますが、20 000以上の名前があるため、これを行うためのより速い方法が必要です。
事前に感謝します。
解決
これが最も速い方法です。
または、1つのコマンドですべてのレコードを更新しますか?
結合を使用して更新を行うことができます(固定構文... Haventはこれをしばらく使用していました)
UPDATE animalTable
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID
SET animalTable.cDescription = CodeTable.Description_1;
もう1つのオプションは、更新を小さなバッチに分割することです。これにより、テーブルがロックされる時間が短縮されます。各バッチで特定のID範囲のみを更新します。
また、そのデータを別のテーブルに入れることもできます。データは正規化されていないため。正規化するように移動します。
他のヒント
変換値を保持する一時テーブルを作成し、それに基づいて更新することができます。
例:
create table #TRANSLATIONS
(
from varchar(32),
to varchar(32)
)
次に、翻訳値を挿入します:
insert into #TRANSLATIONS (from,to) values ('cat','dog')
最後に、それに基づいて更新します:
update MYTABLE
set myvalue = t.to
where myvalue = t.from
from MYTABLE m,
#TRANSLATIONS t
(テストされていない、私の頭の上)。
CASE ステートメントを使用して更新することができます
animaltable SET cDescription = UPDATE animaltable SET cASE = ID THE WHEN 1 THEN 'cat' WHEN 2 THEN 'bird' .... END
次のようなファイルがあるとします:
1,cat
2,bird
...
そのファイルを読み取り、行ごとに更新を実行するスクリプトを作成します。
PHPの場合:
$f = fopen("file.csv","r")
while($row = fgetcsv($f, 1024)) {
$sql = "update animalTable set cDescription = '".$row[1]."' where CodeID = ".$row[0];
mysql_query($sql);
}
fclose($f);
高速化するためにできることは、割り当てたい値がまだないレコードのみを更新することです。
UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"
このアプローチにより、コマンドはまだ「cat」ではないレコードのみを更新します。
免責事項:私は猫が嫌いです。