3

我的数据库中有一张桌子。我的表有几个字段,包括一个自动递增的 id 字段设置为主键,另一个字段称为“引用”,我确实设置为唯一。为了填充该表,我有一个使用 pdo 在该表中插入记录的 php 脚本。每次插入成功(意味着表中不存在“引用”)时,我都会增加一个名为 $newOnes 的变量。如果值“reference”已在表中,则会触发代码为 23000 的异常。在这种情况下,我增加了另一个名为 $doublons 的变量。不幸的是,当 while 循环“处理”表的最后一条记录时,我的脚本触发了一个致命错误,异常 23000 。我不明白。预先感谢您的帮助。干杯。马克。

我的PHP代码:

try {
  $connexion = connexion('localhost', 'user', 'user', 'mydb');
  $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $qry_bat = $connexion->query('SELECT...');
  $ins_db = $connexion->prepare('INSERT...');
}
catch (PDOException $e) {
  echo $e->getMessage();
}

while($row = $qry_bat->fetch(PDO::FETCH_ASSOC)) {
  try {
    $ins_db->execute(array(...));
    $newOnes++;
  }
  catch (PDOException $e) {
    if ($e->getCode() != 23000) {
      echo '<span class="msg-alert">'.$e->getMessage().'</span>';
    } else {
      $doublons++;
    }
  }
}

我得到的致命错误(注意第 22 行是指 while(...) 行):

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]:  
Integrity constraint violation: 1062 Duplicate entry 'theFieldContentOfTheLastRecordOfTheTable' for key 'theFieldNameReference' in  
/myFilePath/file.php:22 Stack trace: #0 /myFilePath/file.php(22): PDOStatement->fetch(2)  
#1 {main} thrown in /myFilePath/file.php on line 22

编辑 //////////

原始表(要提到的事情):
自动递增 id

要插入的表(要提及的事情):
在 id 字段上自动递增
UNIQUE INDEX 参考

4

3 回答 3

6

升级到答案

看起来像这个 bug,将近五年后仍然开放;改为尝试:

while (true) {
  try {
    $row = $qry_bat->fetch(PDO::FETCH_ASSOC);
    if (!$row) break;
    $ins_db->execute(array(...));
    $newOnes++;
  }
  catch (PDOException $e) {
    if ($e->getCode() != 23000) {
      echo '<span class="msg-alert">'.$e->getMessage().'</span>';
    } else {
      $doublons++;
    }
  }
}
于 2012-05-26T10:10:17.967 回答
1

堆栈跟踪显示在 try/catch 块之外的 fetch 中发生的异常。

SELECT 语句正在触发:

Integrity constraint violation: 1062 Duplicate entry 'theFieldContentOfTheLastRecordOfTheTable'

有一个名为theFieldContentOfTheLastRecordOfTheTable的唯一键与之冲突。

您能否发布架构让我们看看这会如何影响完整性?

于 2012-05-26T10:16:25.563 回答
0

在该列中查找已脏/重复的数据。某些应用程序允许在已捕获数据后应用“松散”约束。这可能发生在您的情况下。

于 2014-11-03T12:09:15.617 回答