2011-08-11 7 views
1

私は、大きな理由のために小さなテーブルに分割する必要のあるかなり大きなDBテーブルを取得しました。255行を挿入した後にMySQLが停止する

取り扱いは、この例に近いPHPを経由して行われます

// Note: It's an example and not working code - the actual function is much larger 
function split_db() 
{ 
    $results = " 
     SELECT * 
     FROM big_table 
    "; 

    foreach ($results as $result) 
    { 
     // Here I split the big_tables contents and ... 
     $some_val = $result->SomeVal; 
     // ... 
     $another_val = $result->AnotherVal; 

     // ... here I insert the contents in the different tables 
     $sql = " 
      INSERT 
      INTO first_small_table 
      // ... 
      VALUES 
      // ... 
     "; 
    } 
} 

問題:クエリが255行、私はローカル環境またはテストサーバー上だ場合に関係なく挿入

質問:なぜですか?何が間違っているのですか?何か不足していますか?そして、どうすればこれを避けることができますか? MySQLのクライアント・バージョンについて

情報:

  • のDev-サーバー: 5.0.32、
  • ローカルのDev-ENV: 5.1.41

私はMySQLのヒーローではないので、 Googleは(私に)意味がないので、助けと説明を感謝します。ありがとう!

+0

'SELECT * FROM big_table'はすべての行を返しますか? –

+0

@ Mahdi.Montgomeryはい、そうです。 – kaiser

答えて

7

unsigned tinyintタイプのプライマリキーがあり、最大値は255です。

だからint

ALTER TABLE first_small_table MODIFY id INT; 
+0

'ID tinyint(15)UNSIGNED NOT NULL AUTO_INCREMENT'と' PRIMARY KEY(ID) 'です。何が起きているのか教えてください。 – kaiser

+0

@kaiser: 'UNSIGNED'' tinyint'は、間隔0..255の数値を格納できます。 'int 'に変更する必要があります – zerkms

+0

@kaiser:タイプを適切なものに変更するコマンドで私の答えを更新しました – zerkms

5

私はあなたが255行に制限されている理由を言うことができないためにそれを変更しますが、私が言うことができることはあなたからあなたの行を追加するために、単一のクエリを行うことができるということです、あなたのINSERT INTOを使用して小さなテーブルに大きなテーブル... SELECTクエリ:

INSERT INTO first_small_table (col1, col2, col3) 
SELECT col1, col2, col3 
FROM big_table; 

あなたは、PHPを使用する必要がない場合は、すべてでそれを使用しないでください意味。 SQLだけを使う方が速いです。

+0

私は - 悲しいことに - これをPHPで書く必要があります。しかし、とにかく+1: – kaiser

+0

@カイザー:何か特別な理由がありますか? –

+0

私はクライアントサーバーに触れる人ではありません。私は次のバージョンを開発する人にはならない可能性もあります。その他たくさんの理由があります... – kaiser

関連する問題