質問

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」ではないレコードのみを更新します。

免責事項:私は猫が嫌いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top