我有一个复合PK,我需要在其中更新其PK值之一。但是由于某些内部问题,我无法将更新查询激发到PK列。
所以我触发了DELETE和INSERT查询。
此删除和插入是在事务内部完成的(已提交读)。
但是有时候,当两个请求确实更新到同一行时。在重复输入项时,将引发关键PRIMARY错误。这是随机发生的,我在本地重现此问题做了很多尝试,但找不到根本原因。
注意:由于某些内部限制,我无法尝试执行以下操作。
请帮助我解决这个问题。
更新:
样本表结构:
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);
删除和插入的数量将始终相同
假设删除插入对始终配对,请使用INSERT .. ON DUPLICATE KEY UPDATE ..
而不是单独的SQL命令。这将这些步骤组合成一个单独的原子操作。因此,它避免了所谓的问题交易。
复合PRIMARY KEY
与DELETE
的单列规范一起令人费解。这意味着Delete from temp where id2=100
可能会删除多行。那么,批处理删除操作后是多个INSERTs
?这可以通过IODKU来实现,并且效率更高,甚至更有效率。