php - mysql PDO 更新查询错误,键为 1062 Duplicate entry '4146' for key 'PRIMARY'
问题描述
我有一个 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”: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();
我希望查询执行更新而不会出错。感谢您提供的任何见解!
解决方案
您的查询没有 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
推荐阅读
- excel - VBA - 自动过滤表格并粘贴到新工作表
- java - 当 ModuleLoader 是依赖项时加载模块
- github - 删除流行的存储库部分 - Github
- c# - 在 LINQ 中使用通用列
- java - 使用布尔值来协调 Java 中的两个线程
- spring-cloud - 如何使用 Stream 为 Spring Cloud Dataflow 中的子任务设置全局环境变量 - Task-Launcher
- node.js - IAM 权限在尝试检测对话流 CX 的意图时被拒绝
- postgresql - Postgres:运行一些硬编码的 SQL,然后放到交互式终端
- php - 如何在运行时更改 Cookies 值
- typescript - 扩展的实用程序类型?