删除并插入引发键PRIMARY的重复条目

问题描述 投票:1回答:1

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

所以我触发了DELETEINSERT查询。

此删除和插入是在事务内部完成的(已提交读)。

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

注意:由于某些内部限制,我无法尝试执行以下操作。

  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)

样本数据:

+-----+-----+-----+-------+
| id1 | id2 | id3 | value |
+-----+-----+-----+-------+
|   1 | 100 | 111 |   123 |
|   2 | 200 | 222 |   456 |
+-----+-----+-----+-------+

样本查询:

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

Delete from temp where id2=100
Insert into temp values(3,100,111,123);

交易T2尝试to update ID1=3 value where id2=100

Delete from temp where id2=100
Insert into temp values(3,100,111,123);

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

mysql database innodb mysql-5.7
1个回答
0
投票

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

复合PRIMARY KEYDELETE的单列规范一起令人费解。这意味着Delete from temp where id2=100可能会删除多行。那么,批处理删除操作后是多个INSERTs?这可以通过IODKU来实现,并且效率更高,甚至更有效率。

© www.soinside.com 2019 - 2024. All rights reserved.