2012-01-10 15 views
0

によってテーブル内のデータを更新する:私は私がクエリを使用TABLE1を更新するために、表1に変更するデータを保持し、この一時テーブル持っているバッチ

UPDATE table1 pr 
INNER JOIN tmpTable tmp 
ON (pr.product_id = tmp.product_id) 
SET pr.isactive = tmp.isactive 

をしかしtmpTableは、大量のデータを保持しているので、更新するには、私のクエリは時々 'タイムアウト'に終わります。だから私の質問は、基本的にバッチで自分のデータを更新するための最も簡単な方法は何ですか?例えば、10K。

ありがとうございます!

+0

10Kは多くのデータのようには見えません。あなたのインデックスをチェックしましたか?両方のテーブルの 'product_id'が同じデータ型で、長さが同じで、索引付けされていることを確認してください。それが助けになるかもしれない。 –

+0

こんにちはAyman、実際には、テーブルをバッチ単位で更新できる行の例として10Kを使用しています。言って、4Mデータを10K更新してください。 –

答えて

1

あなたはこれをPHPでタグ付けしました。あなたは、単一のクエリだけでなく、そこでいくつかの作業をしたいと思っています。クエリを複数回実行します。何かのように

for($i<$minId; $i<maxId;$i+=10000){ 

    $db->query("UPDATE table1 pr 
    INNER JOIN tmpTable tmp 
    ON (pr.product_id = tmp.product_id) 
    SET pr.isactive = tmp.isactive where isactive between $i and $i+10000"); 

} 

MyISAMを実行している場合は、このように部分的に完了した状態になる危険性があります。実行中のinnodbをトランザクションのすべてまたは何も指定しないままにしたい場合、そのループをbegin/commitでラップする必要があります。しかし、潜在的に大規模なトランザクションを潜在的に持つ可能性があるという悪影響に対処することになります。

具体的な内容について詳しく説明できる場合は、そのルートをさらに深く理解することができます。

0

WHERE句を使用してデータを制限します。現在提供している情報でどこをフォーマットするのが不可能ですか。

1

一時テーブル内のプライマリまたはIDキーとUPDATEステートメントのWHERE句を使用して、レコード数を制限することができます。例:

UPDATE table1 pr 
INNER JOIN tmpTable tmp 
ON (pr.product_id = tmp.product_id) 
SET pr.isactive = tmp.isactive ***WHERE tmp.ID BETWEEN 1 and 10000*** 

これが役に立ちます。

関連する問題