Ошибки запроса обновления MySQL PDO с 1062 Дублирующая запись '4146' для ключа 'ПЕРВИЧНЫЙ' - PullRequest
0 голосов
/ 25 мая 2019

У меня есть база данных mysql, и запрос построен на PHP. Запрос является традиционным запросом на обновление, но когда он выполняется, я получаю сообщение об ошибке 1062 Дубликат записи «4146» для ключа «ПЕРВИЧНЫЙ». Это кажется противоречивым, поскольку я пытаюсь обновить строку 4146, я не уверен, почему она жалуется.

У меня есть другие операторы PDO, которые работают нормально. Я попытался указать различные PDO :: PARAM и гуглил около часа, не найдя хорошего ответа.

Вот базовый SQL-оператор, за которым следует ошибка:

UPDATE tmp_event set
    event_no=:event_no,
    artist_no=:artist_no,
    squality_no=:squality_no, 
    studio_album=:studio_album, 
    album=:album, 
    concert_display=:concert_display, 
    collection_display=:collection_display, 
    interview=:interview, 
    complete=:complete, 
    tradeable=:tradeable, 
    event_date=:event_date, 
    unqualified=:unqualified, 
    event_day=:event_day, 
    event_month=:event_month, 
    event_year=:event_year, 
    comments=:comments, 
    venue_no=:venue_no, 
    media_no=:media_no

Исключение PDO: Исключение PDO: SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись '4146' для ключа 'PRIMARY' в /media/web/www/2.4/admin/submit.php:969 Трассировка стека: # 0 /media/web/www/2.4/admin/submit.php(969): PDOStatement-> execute () # 1 {main}

Вот код PHP, который делает эту работу:

$sql = "UPDATE tmp_event set event_no=:event_no, artist_no=:artist_no, squality_no=:squality_no, studio_album=:studio_album, album=:album, concert_display=:concert_display, collection_display=:collection_display, interview=:interview, complete=:complete, tradeable=:tradeable, event_date=:event_date, unqualified=:unqualified, event_day=:event_day, event_month=:event_month, event_year=:event_year, comments=:comments, venue_no=:venue_no, media_no=:media_no";

$handle = $link -> prepare($sql);
$handle->bindparam(':event_no',$event_no, PDO::PARAM_INT);
$handle->bindparam(':artist_no',$artist_no, PDO::PARAM_INT);
$handle->bindparam(':squality_no',$squality_no, PDO::PARAM_INT);
$handle->bindparam(':studio_album',$studio_album, PDO::PARAM_INT);
$handle->bindparam(':album',$album, PDO::PARAM_INT);
$handle->bindparam(':concert_display',$concert_display, PDO::PARAM_INT);
$handle->bindparam(':collection_display',$collection_display, PDO::PARAM_INT);
$handle->bindparam(':interview',$interview, PDO::PARAM_INT);
$handle->bindparam(':complete',$complete, PDO::PARAM_INT);
$handle->bindparam(':tradeable',$tradeable, PDO::PARAM_INT);
$handle->bindparam(':event_date',$event_date, PDO::PARAM_STR);
$handle->bindparam(':unqualified',$unqualified, PDO::PARAM_INT);
$handle->bindparam(':event_day',$event_day, PDO::PARAM_INT);
$handle->bindparam(':event_month',$event_month, PDO::PARAM_INT);
$handle->bindparam(':event_year',$event_year, PDO::PARAM_INT);
$handle->$bindparam(':comments',$comments, PDO::PARAM_STR);
$handle->bindparam(':venue_no',$venue_no, PDO::PARAM_INT);
$handle->bindparam(':media_no',$media_no, PDO::PARAM_INT);
$handle->execute();             

Я ожидаю, что запрос выполнит обновление без ошибок. Спасибо за ваше понимание!

1 Ответ

1 голос
/ 25 мая 2019

В вашем запросе нет предложения WHERE, поэтому он попытается обновить каждую строку в таблице.Как только он делает это в первой строке, он пытается установить столбец event_no и находит, что у него есть дубликат.

Добавьте в запрос предложение WHERE и не пытайтесь установить event_no

UPDATE tmp_event set artist_no=:artist_no, squality_no=:squality_no, studio_album=:studio_album, album=:album, concert_display=:concert_display, collection_display=:collection_display, interview=:interview, complete=:complete, tradeable=:tradeable, event_date=:event_date, unqualified=:unqualified, event_day=:event_day, event_month=:event_month, event_year=:event_year, comments=:comments, venue_no=:venue_no, media_no=:media_no WHERE event_no = :event_no
...