删除和插入会为键 PRIMARY 抛出重复条目

vin*_*eth 5 mysql database innodb mysql-5.7

我有一个复合 PK,我需要在其中更新其 PK 值之一。但是由于一些内部问题,我无法向 PK 列发出更新查询。

所以我正在触发DELETEINSERT查询。

DELETEINSERT是内完成TRANSACTION(READ提交)。

但有时,当两个请求确实更新到同一行时。OnPRIMARY引发关键错误的重复条目。这是随机发生的,我在本地重现此问题时尝试了很多,但找不到根本原因。

注意:由于一些内部限制,我无法尝试以下内容。

  1. 将查询更新为 PK
  2. 替换查询
  3. 插入重复或插入忽略查询
  4. 当前为此表添加运行 ID 将是一次巨大的迁移。

请帮我解决这个问题。

更新:

示例表结构:

       Table: temp
Create Table: CREATE TABLE `temp` (
  `id1` int(11) NOT NULL,
  `id2` int(11) NOT NULL,
  `id3` int(11) NOT NULL,
  `value` int(11) DEFAULT NULL,
  PRIMARY KEY (`id1`,`id2`,`id3`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

样本数据:

+-----+-----+-----+-------+
| id1 | id2 | id3 | value |
+-----+-----+-----+-------+
|   1 | 100 | 111 |   123 |
|   2 | 200 | 222 |   456 |
+-----+-----+-----+-------+
Run Code Online (Sandbox Code Playgroud)

示例查询:

事务 T1 尝试 to update ID1=3 value where id2=100

Delete from temp where id2=100
Insert into temp values(3,100,111,123);
Run Code Online (Sandbox Code Playgroud)

事务 T2 尝试 to update ID1=3 value where id2=100

Delete from temp where id2=100
Insert into temp values(3,100,111,123);
Run Code Online (Sandbox Code Playgroud)

删除和插入的次数将始终相同

Ric*_*mes 1

假设删除-插入对始终成对出现,请使用INSERT .. ON DUPLICATE KEY UPDATE ..而不是单独的 SQL 命令。这将这些步骤组合成单个原子操作。因此,它避免了所谓的交易问题。

复合材料PRIMARY KEY与单列规格一起令人DELETE费解。这意味着Delete from temp where id2=100可能会删除多行。那么,批量删除之后是多个INSERTs? IODKU 可以实现这一点,并且同样高效,甚至可能更高效。