mysql PDO 更新查询错误,1062 Duplicate entry '4146' for key 'PRIMARY'

Posted

技术标签:

【中文标题】mysql PDO 更新查询错误,1062 Duplicate entry \'4146\' for key \'PRIMARY\'【英文标题】:mysql PDO update query errors with 1062 Duplicate entry '4146' for key 'PRIMARY'mysql PDO 更新查询错误,1062 Duplicate entry '4146' for key 'PRIMARY' 【发布时间】:2019-10-11 23:37:03 【问题描述】:

我有一个 mysql 数据库,查询是用 php 构建的。该查询是一个传统的更新查询,但是当它运行时,我收到一个错误,指出 1062 Duplicate entry '4146' for key 'PRIMARY'。这似乎违反直觉,因为我正在尝试更新第 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 异常:PDOException:SQLSTATE [23000]:完整性约束违规:1062 /media/web/www/2.4/admin/submit.php:969 中的键 'PRIMARY' 的重复条目 '4146' 堆栈跟踪:#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();             

我希望查询能够正确执行更新。感谢您提供的任何见解!

【问题讨论】:

我假设 event_no 是你的 PK。试试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, 【参考方案1】:

您的查询没有 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

【讨论】:

LULZ 我喜欢你复制和粘贴我的评论作为答案的方式,但我什至没有费心为我的评论投票。 @bassxzero 您的评论没有试图解释问题,因此不值得点赞。您认为是复制粘贴的部分只能是查询,无论如何都会出现相同的结果。您本可以发布自己的答案,但选择不发布。除非您认为我的回答有问题,否则我会要求您撤回您的反对票。 @bassxzero 修复非常明显 - 很可能有人会编写与您的评论完全相同的查询而不阅读它。此外,您的查询中有语法错误(最后是,)。请阅读:meta.***.com/a/288849/5563083 感谢红鲱鱼,轻松捕捉。不知道我的查询发生了什么。欣赏第二双眼睛,因为我离得太近了。

以上是关于mysql PDO 更新查询错误,1062 Duplicate entry '4146' for key 'PRIMARY'的主要内容,如果未能解决你的问题,请参考以下文章

如果需要,插入更新 pdo mysql 查询并获取最后插入的 id

“违反完整性约束:1062 重复条目”-但没有重复行

循环更新查询 pdo where id

使用带有 PDO 的数组更新多个 MySQL 表列

PHP / PDO动态绑定值(无效的参数计数错误)

如何将节点 js 中的错误对象正确转换为字符串?