2011-08-11 106 views
1

我得到了一個非常大的DB表,我需要根據不同的原因將表分成更小的表。MySQL在插入255行後停止

的處理通過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客戶端版本:

  • 開發 - 服務器: 5.0.32,
  • 本地開發包膜蛋白: 5.1.41

我不是MySQL-Hero,所以任何幫助和解釋讚賞,因爲谷歌沒有帶來任何有意義的(對我)。謝謝!

+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

@kaiser:你有什麼特別的理由? –

+0

我不是那個接觸客戶端服務器的人。還有一種機會,我不會成爲開發下一個版本的人。等Lot的原因... – kaiser