3

20,000 を超える名前を、CodeID を指定して作成した新しい名前に置き換える必要があります。

例: 「犬」(CodeID が 1) を含むすべての行を「猫」で更新し、「馬」(CodeID が 2) を含むすべての行を「鳥」で更新する必要があります。

最初の SQL ステートメント: UPDATE animalTable SET cDescription= "cat" WHERE CodeID= 1

2 番目の SQL ステートメント: UPDATE animalTable SET cDescription= "bird" WHERE CodeID= 2

これらのステートメントは機能しますが、20 000 を超える名前があるため、これを行うためのより高速な方法が必要です。

前もって感謝します。

4

5 に答える 5

7

それが最速の方法です。

または、単一のコマンドですべてのレコードを更新しますか?

結合を使用して更新を行うことができます(固定構文...しばらくの間これを使用していません)

UPDATE animalTable 
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID 
SET animalTable.cDescription = CodeTable.Description_1;

別のオプションは、更新を小さなバッチに分割することです。これにより、テーブルがロックされる時間が短縮されます...ただし、更新の合計時間は長くなります (これは、予測されたパフォーマンスの単なる改善です)各バッチの ID 範囲。

また、別のテーブルにそのデータを含めることもできます。データが正規化されていないためです。より正規化されるように移動します。

于 2009-09-17T07:44:33.943 に答える
4

翻訳値を保持する一時テーブルを作成し、それに基づいて更新することができます。

例えば:

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

(私の頭の上から、テストされていません)。

于 2009-09-17T07:46:49.977 に答える
2

ステートメントを使用しCASEて更新できます。

UPDATE animaltable SET cDescription = CASE codeID WHEN 1 THEN 'cat' WHEN 2 THEN 'bird'.... END
于 2009-09-17T07:45:02.817 に答える
1

次のようなファイルがあるとします。

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);
于 2009-09-17T07:50:10.157 に答える
0

高速化するためにできることは、割り当てたい値をまだ持っていないレコードのみを更新することです。

UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"

このアプローチにより、コマンドは、まだ「cat」ではないレコードのみを更新します。

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

于 2015-07-09T16:29:07.940 に答える