2013-04-14 79 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,造成重复值