为什么循环还原?

时间:2013-04-14 11:44:44

标签: php mysql

我正在将一些数据插入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());
    }
}

3 个答案:

答案 0 :(得分: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上花了几分钟

答案 1 :(得分: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接口...

答案 2 :(得分: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`)
)

我猜你有同一页2 instances的{​​{1}},导致重复的值