【问题标题】:Mysql Duplicate entry error on ON DUPLICATE KEY UPDATE关于 ON DUPLICATE KEY UPDATE 的 Mysql 重复输入错误
【发布时间】:2021-09-27 03:40:51
【问题描述】:

我正在使用内存表。它有几个 id 和一个计数器。所有数据为整数。 如果数据存在,我的代码将计数器更新为 1,如果不存在,我的代码将创建一行 counter=1

我使用的查询是:

INSERT INTO linked_mem
    ( id1, id2, id31, id4, cnt)
    VALUES (31316, 0, 557158967, 261470594, 1)
ON DUPLICATE KEY UPDATE cnt = cnt+1

偶尔(大约 5% 的插入)我得到“键 1 的重复条目 '[键号]'

可能是什么问题? ON DUPLICATE KEY UPDATE 部分不是应该处理重复键吗?

更新:添加创建真实表的表

CREATE TABLE `linked_mem` (
  `li_sid` int(10) unsigned NOT NULL default '0',
  `li_id1` int(10) unsigned NOT NULL default '0',
  `li_cid1` int(10) unsigned NOT NULL default '0',
  `li_id2` int(10) unsigned NOT NULL default '0',
  `li_cid2` int(10) unsigned NOT NULL default '0',
  `cnt` int(10) unsigned NOT NULL default '1',
  `li_filter` int(10) unsigned NOT NULL default '0',
  `li_group` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`li_id1`,`li_sid`,`li_cid1`,`li_cid2`,`li_group`,`cnt`,`li_id2`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1

【问题讨论】:

  • 可以上传linked_mem的创建表吗

标签: mysql


【解决方案1】:

如果您更新标记为 UNIQUE 的字段并且第二次密钥违规发生在 UPDATE 上,则会发生这种情况。

更新

从你的表结构中我可以看出这正是你的情况。

事情就是这样:

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)

-- inserts

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)

-- updates `cnt` to 2

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)

-- tries again to update `cnt` to 2 and fails

从您的 PRIMARY KEY 定义中删除 cnt

【讨论】:

    【解决方案2】:

    您确定主键是正确的吗?使用这个主键也可以通过 cnt 的值来识别一行,它应该是一个计数器。

    我没有对此进行测试,但我认为如果您从一个空表开始,以下查询会给出错误。

    INSERT INTO linked_mem
        ( id1, id2, id31, id4, cnt)
    VALUES 
        (1, 1, 1, 1, 1),                  // (1, 1, 1, 1, 1) added
        (1, 1, 1, 1, 1),                  // (1, 1, 1, 1, 1) -> (1, 1, 1, 1, 2)
        (1, 1, 1, 1, 1),                  // (1, 1, 1, 1, 1) added (now two rows)
        (1, 1, 1, 1, 1)                   // error
    ON DUPLICATE KEY UPDATE cnt = cnt+1
    

    在第四行,(1, 1, 1, 1, 1) 将更新为 (1, 1, 1, 1, 2),但这已经存在。

    【讨论】:

      【解决方案3】:

      cnt 在主键中,这可能是导致错误/无法更新它的原因。

      【讨论】:

        【解决方案4】:

        很难用不具信息性的列名来判断,但是主键太宽了,看起来毫无用处。它实际上在做什么,为什么选择那组列?有更好的选择吗?我猜其他海报是对的,您的更新违反了PK的隐含唯一性约束;计数是您的 PK 列之一,这几乎是意料之中的。

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题。

          使用 ON DUPLICATE KEY UPDATE 仍然出现错误:Duplicate entry

          这是由具有唯一键索引的另一列和其中包含空值的一行引起的。

          【讨论】:

            【解决方案6】:

            重复键异常可能有 3 个原因

            1. 您将 int 转换为字符串,反之亦然

            2. db列和表列之间的拼写错误

            3. 您正在尝试更新主键或在更新期间设置 pk

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-02-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-01
              • 1970-01-01
              • 2015-07-30
              • 2021-02-06
              相关资源
              最近更新 更多