【问题标题】:mysql INSERT INTO loop not inserting some rowsmysql INSERT INTO循环不插入一些行
【发布时间】:2014-04-04 17:09:42
【问题描述】:

我有一个循环将新行插入到我的数据库中。它专门用于在'name' 列中插入具有唯一值的特定行数。

while($rows_inserted < 100) {
    // Create a random number  
      
    //Min & Max values for the random numbers
    $min = 5001;
    $max = 5100;
    
    $number = rand($min,$max);
    
    //Connect to the DB using $con details & execute query
    mysqli_query($con,"INSERT INTO cmssps_card_codes (id, parent_id, name, status) VALUES ('', '', '$number', '0')");
    
    if (mysqli_affected_rows($con) === 1) {
        $rows_inserted++;  // update the counter
    }
}

在这个特定的有限实例中,我在 5001 和 5100 之间创建了 100 个“随机”数字,因此在这种情况下它是多余的,但随机数用于生产实例 - 只是为了避免混淆。

我的问题是该语句成功执行,但实际上只创建了 87 奇数行。然后,我尝试运行代码以插入先前排除的行的单个实例,然后它进入一个无限循环——但是,我可以直接在数据库中创建该行。就好像 PHP 代码识别出该行已被创建,而实际上它并没有。

有什么想法吗?

【问题讨论】:

  • nameunique 约束?
  • 您必须向我们展示表定义,以查看您是否试图违反某些约束。预计其中会有一些重复的 $number。
  • 如果你以 100 的间隔生成 100 个随机数(例如 1 .. 100),你不可能得到 100 个唯一的数字!会有重复。这就是为什么你从 100 个随机数中得到 87 行的原因。

标签: php mysql loops while-loop


【解决方案1】:

你必须在while之前定义$rows_inserted

 $rows_inserted = 0;
 while($rows_inserted < 100) {
 ....

您要插入 100 行,其中包含 100 个不同的 $number,因此您必须确保 random 可以重复某些值,例如 501250605012 ...,如果您的列 name 有一个独特的约束,它不会保存重复的数字。

您保存了 87 个值意味着您有 13 个重复值未保存。所以要么:

1- 像这样获得独一无二的$number

$number = 5001 + $rows_inserted ;
mysqli_query($con,"INSERT INTO cmssps_card_codes (id, parent_id, name, status) 
                   VALUES ('', '', '$number', '0')");

2- 或更改您的列名并删除那里的UNIQUE 约束以接受重复值。

【讨论】:

  • 谢谢。这似乎奏效了。正如其他人所说的那样,创建重复项然后跳过的问题。
猜你喜欢
  • 1970-01-01
  • 2015-05-10
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多