2013-04-14 78 views
2

爲了測試目的,我將一些數據插入到MySQL表中。下面的代碼爲每個c增加了20行。直到c的價值超過一百萬。之後,它開始爲之前添加的行添加行。我們如何解決這個問題?爲什麼循環回覆?

for($c=1; $c<=2000000; $c++) 
{ 
    for($i=0; $i<=19; $i++) 
    { 
     $query = "INSERT INTO selections (c_id, i_id) VALUES('$c', '$i')"; 
     mysql_query($query) or die("Cannot add... " . mysql_error()); 
    } 
} 
+1

爲什麼你要這樣做?這不應該建立。 – Niels

+3

這與您的字段大小有關。你的表中'c_id'和'i_id'的限制是什麼? 'INT(X)'? –

+0

@Niels:我需要測試一個有int數字的表格。 – mustafa

回答

1

PHP的數字不可能在包裝上百萬的水平,所以這是因爲你的數據庫的領域配置。對於PHP簡單測試的可能:

for($i = 2000000; $i < 2000020; i++)echo "$i"; 

你會看到,PHP可以管理數正確...

在MySQL

SMALLINT

A small integer 
The signed range is –32768 to 32767. The unsigned range is 0 to 65535 

MEDIUMINT

A medium-size integer 
The signed range is –8388608 to 8388607. The unsigned range is 0 to 16777215 

所以,如果你使用上面的一個爲C_ID的數據類型範圍的上限後,將包裹...

警告不要使用mysql接口,否則請不要使用PDO或mysqli接口...

+0

我使用的字段是INT(11)。 – mustafa

2

如果您的任務的目的只是爲了填充他的數據,而不是試圖用PHP腳本插入它,你可以做,在mysql中使用這樣

DELIMITER $$ 
CREATE PROCEDURE insert_selections(IN max_value INT) 
BEGIN 
DECLARE i INT DEFAULT 1; 
WHILE i <= max_value DO 
    INSERT INTO selections VALUES 
    (i, 1), (i, 2), (i, 3), (i, 4), (i, 5), (i, 6), (i, 7), (i, 8), (i, 9), (i, 10), 
    (i, 11), (i, 12), (i, 13), (i, 14), (i, 15), (i, 16), (i, 17), (i, 18), (i, 19), (i, 20); 
    SET i = i + 1; 
END WHILE; 
END$$ 
DELIMITER ; 

一個簡單的存儲過程,並執行它

CALL insert_selections(2000000); 

我的Mac上花了幾分鐘的時間

+0

+1這個快速的方法。我們如何使用隨機數字添加二十行。我不想要1,2,3等。 – mustafa

+0

你需要1-20範圍內的隨機數(這意味着他們可以重複),或者你需要從1到20的確切數字,但是是以隨機順序嗎? – peterm

+0

我解決了它。謝謝。 – mustafa

0

的代碼共享,似乎對我的地方做工精細,我加的2列組合unique index

CREATE TABLE `selections` (
    `c_id` INT(10) NULL DEFAULT NULL, 
    `i_id` INT(10) NULL DEFAULT NULL, 
    UNIQUE INDEX `c_id_i_id` (`c_id`, `i_id`) 
) 

我猜你有executing同一頁2 instances,造成重複值