2

我正在向 MySQL 表中插入一些数据以进行测试。下面的代码为每个添加了 20 行c。并且这样做直到价值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());
    }
}
4

3 回答 3

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 上花了几分钟

于 2013-04-14T12:35:01.813 回答
1

php 数字不太可能以百万级别包装,所以这可能是因为您的数据库的字段配置.. php 的简单测试:

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

你会看到php可以正确管理数字...

在mysql中

小灵通

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

中型

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

因此,如果您使用上述之一作为c_id的数据类型,它将在范围上限之后换行......

警告不要使用已弃用的 mysql 接口,请改用 PDO 或 mysqli 接口...

于 2013-04-14T12:15:16.910 回答
0

共享的代码似乎在我的本地工作正常,我unique index在 2 列上添加了一个组合

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相同的页面executing,导致重复的值

于 2013-04-14T12:46:30.313 回答