【问题标题】:duplicate key entry when copying entry from poll to poll_logs将条目从 poll 复制到 poll_logs 时重复键条目
【发布时间】:2022-01-14 20:17:45
【问题描述】:

我有一个 Spring Boot 项目,当通过批处理处理条目时,它将轮询条目传输到 poll_logs。这工作正常,但是当批处理作业重新启动时,会发生这种情况:

嵌套异常是 java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '2' for key 'PRIMARY'

我只是想知道发生这种情况的原因。是因为 Spring 和 MySQL 之间发生了神秘事件还是我们的错误?

poll 表的 id 具有 auto_increment 属性,而 poll_logs 的 id 则没有。 此外,这里是将条目传输到 poll_logs 的查询

复制投票项目

INSERT INTO poll_log SELECT * FROM poll WHERE id = <id>

删除投票项目

DELETE FROM poll WHERE id = <id>

【问题讨论】:

  • 这里没什么神秘的。当您的批处理作业重新开始从poll 复制已存在于poll_logs 中的数据时。您需要确保不会发生这种情况,或者使用INSERT 的变体而不是处理它。以INSERT IGNOREINSERT...ON DUPLICATE KEY... 为起点
  • 我明白了,我会检查它并采取必要的措施来防止它发生。感谢您的意见。

标签: mysql spring-boot


【解决方案1】:

您正在尝试插入已存在于 poll_log 中的投票。

添加一个子句来忽略已经存在的投票。

INSERT INTO poll_log SELECT * FROM poll WHERE id = <id> AND NOT EXISTS (SELECT 1 FROM poll_log pl WHERE pl.id = poll.id)

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2014-12-30
    • 2013-05-08
    • 1970-01-01
    • 2021-09-17
    • 2023-04-03
    • 2012-04-05
    • 2011-11-11
    • 2014-05-20
    相关资源
    最近更新 更多