У меня есть таблица в моем db. Моя таблица имеет несколько полей, в том числе поле с автоматически увеличивающимся идентификатором, заданное как первичный ключ, и другое поле, называемое ссылкой, которое я установил как уникальный. Чтобы заполнить эту таблицу, у меня есть php-скрипт, который вставляет записи в эту таблицу с помощью pdo. Каждый раз, когда вставка была успешно выполнена (это означает, что «ссылка» не существует в таблице), я увеличиваю переменную с именем $ newOnes. Если значение 'reference' уже находится в таблице, запускается исключение с кодом 23000. В этом случае я увеличиваю другую переменную с именем $ doublons. К сожалению, мой скрипт запускает фатальную ошибку с исключением 23000, когда цикл while обрабатывает последнюю запись таблицы . И я не понимаю. Спасибо заранее за вашу помощь. Приветствия. Марк.
Мой 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
РЕДАКТИРОВАТЬ //////////
оригинальная таблица (вещи, чтобы упомянуть):
auto incremented id
таблица для вставки (вещи, которые следует упомянуть):
auto увеличивается на поле id
УНИКАЛЬНЫЙ ИНДЕКС по ссылке
( Обновление до ответа )
Похож на эту ошибку , которая по-прежнему открыта почти через пять лет; попробуйте вместо этого:
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++; } } }
Трассировка стека показывает исключение, происходящее в выборке, которая находится вне блоков try / catch.
Оператор SELECT запускает:
Integrity constraint violation: 1062 Duplicate entry 'theFieldContentOfTheLastRecordOfTheTable'
Существует уникальный ключ с именемFieldContentOfTheLastRecordOfTheTable, с которым он сталкивается.
Можете ли вы опубликовать схему для нас, чтобы увидеть, как это может повлиять на целостность?
Посмотрите на наличие грязных / повторяющихся данных в этой колонке. Некоторые приложения позволяют использовать «свободное» ограничение ПОСЛЕ того, как данные уже захвачены. Это может произойти в вашем случае.