【问题标题】:MySQL DELETE failing randomly and very infrequentlyMySQL DELETE 随机且非常罕见地失败
【发布时间】:2026-02-14 18:40:01
【问题描述】:

我有一个 MySQL DELETE 语句,后跟一个 INSERT 语句,以确保给定 ID 的数据集只有一个副本。 (我不使用 UPDATE 是有原因的)

问题是我注意到在一个包含 5000 多个条目的数据集中,有 3 个实例没有执行 DELETE 语句,但 INSERT 语句执行了。最终结果是给定 ID 的重复条目。

下面是我的代码。执行失败时,php 脚本将退出并显示错误消息。这一定是我的经验水平。任何想法可能是什么问题?

//delete
$query_delete = "DELETE FROM q1_6_list WHERE q_id = '".mysql_real_escape_string($q[qID])."'";   
$result = mysql_query($query_delete) or errorReport("Error in query: $query_delete. ".mysql_error());
//insert
$query_insert = "INSERT INTO q1_6_list (q_id, vehicle, quantity) VALUES";
$result = mysql_query($query_insert) or errorReport("Error in query: $query_insert. ".mysql_error());
if (!$result)
    errorReport($result);   

编辑

仔细检查后,我注意到我没有在$result = mysql_query($query_delete).... 之后添加以下代码

if (!$result)
    errorReport($result);   

这是否也需要捕获所有其他错误消息,或者mysql_query($query_delete) or errorReport... 是否会捕获所有错误事件?

【问题讨论】:

  • 小错误:$q[qID] 应该是 $q['qID']。如果您实际上有一个名为qID 的常量,这可能会让您大吃一惊 - 在数组键上下文中,php 会将未定义的常量视为未引用的字符串,但如果该常量存在......繁荣。同样,错误消息到底是什么?不要让我们悬而未决...
  • @MarcB 我希望那些是E_ERROR 而不是E_NOTICE
  • 实际上没有我可以追踪的错误消息。它返回给用户应用程序。我也没有在 error_log.txt 中看到该行代码的任何内容。
  • 你的表没有UNIQUE约束有什么原因吗?

标签: php mysql error-handling insert


【解决方案1】:

您最好的选择是在 q1_6_list (q_id) 上创建一个主键:

ALTER TABLE q1_6_list ADD PRIMARY KEY(q_id)

并使用 MySQLs REPLACE INTO 语法,因此丢失删除并且插入变为:

$query_insert = "REPLACE INTO q1_6_list (q_id, vehicle, quantity) VALUES";

【讨论】:

    【解决方案2】:

    只有在删除查询成功的情况下,您才可以简单地运行插入查询:

    if (mysql_query($query_delete)) {
        mysql_query($query_insert);
    }
    

    【讨论】: