【问题标题】:mysql insert after delete fails because of "duplicate entry"由于“重复条目”,删除后mysql插入失败
【发布时间】:2011-07-21 14:27:40
【问题描述】:

我有一个包含两个 mysql 查询的代码。
DELETE FROM my_table WHERE user_id=some_number
INSERT INTO my_table (user_id, ... ) VALUES(some_number, ...)

字段 user_id 是唯一的。

在极少数情况下,插入失败,声称出现重复条目​​。我的第一直觉让我相信 DELETE 没有完成,现在插入试图插入并且我得到一个重复的条目。这可能吗?我怎样才能避免这种情况?你能想到不同的解释吗?

更新:我删除的原因是因为我想删除我第一次没有更新/插入的所有数据。另外,我认为重要的是要说明大多数数据保持不变。

【问题讨论】:

  • 这可能是一个竞争条件,两个进程同时运行相同 ID 的这两个语句吗?
  • 您可能对 REPLACE 和 INSERT ... ON DUPLICATE KEY UPDATE 语句感兴趣
  • DELETE 可能会失败?执行后是否有一些检查?

标签: mysql sql


【解决方案1】:
SET AUTOCOMMIT=0;    
START TRANSACTION;    
DELETE FROM my_table WHERE user_id=some_number;     
INSERT INTO my_table (user_id, ... ) VALUES(some_number, ...); 
commit;

【讨论】:

    【解决方案2】:

    改用 UPDATE 语句:

    UPDATE my_table
    SET my_column = my_value
    WHERE user_id = some_number
    

    【讨论】:

    • 你可以(它是INSERT INTO 语法的 MySQL 变体)。看这里; dev.mysql.com/doc/refman/5.1/en/insert.html
    • 更新不会删除我想替换的旧数据。对吗?
    • 是的,UPDATE 将替换您指定的列数据。您要替换哪些数据?
    • @Noam:你能发布你正在运行的确切查询吗?还有表格的所有字段?
    • 我遇到了同样的问题,这似乎是解决这个问题的最佳方法,插入/删除有点hackish
    【解决方案3】:

    您始终可以在 DELETE 之后尝试 COMMIT 以确保其完成。

    【讨论】:

    • 我只需要添加另一个带有“COMMIT”的查询来尝试吗?如果其他查询速度较慢,它也会等待它们,还是我可以要求等待删除完成?
    • 是的,您可以自己进行提交。从您发布的代码来看,实际上并不需要它,但它会迫使完成第一条语句的问题。
    【解决方案4】:

    为什么你DELETEINSERT 是同一行user_id 而不仅仅是UPDATE 行?

    【讨论】:

    • 因为我想删除我第一次没有更新/插入的所有数据,并且我没有更新所有具有相同数据的行。每个新行/更新行都会有不同的数据。
    • 因为情况可能不同@ypercube
    • @Velaro 你是什么意思?
    • 更新有时会令人困惑(必须实现更多逻辑,外键可能会链接到必须删除或更新的记录),因此删除和插入很简单。实际上是我的情况,我们在事务中删除和插入记录,但是mysql有时会在重复条目中抱怨,我是存根
    • 哦,刚刚看到,您在混凝土领域提出的建议。在这种情况下,为什么不直接更新?(是的,当然)。但是想想一般情况@ypercubeᵀᴹ
    【解决方案5】:

    发生这种情况是因为查询被视为两个单一事务,因此无法保证执行顺序。您描述的效果是因为插入是在删除之前处理​​的。您应该更改查询逻辑或在一个事务中执行两个查询。

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多