vin*_*eth 5 mysql database innodb mysql-5.7
我有一个复合 PK,我需要在其中更新其 PK 值之一。但是由于一些内部问题,我无法向 PK 列发出更新查询。
所以我正在触发DELETE和INSERT查询。
这DELETE并INSERT是内完成TRANSACTION(READ提交)。
但有时,当两个请求确实更新到同一行时。OnPRIMARY引发关键错误的重复条目。这是随机发生的,我在本地重现此问题时尝试了很多,但找不到根本原因。
注意:由于一些内部限制,我无法尝试以下内容。
请帮我解决这个问题。
更新:
示例表结构:
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)
删除和插入的次数将始终相同
假设删除-插入对始终成对出现,请使用INSERT .. ON DUPLICATE KEY UPDATE ..而不是单独的 SQL 命令。这将这些步骤组合成单个原子操作。因此,它避免了所谓的交易问题。
复合材料PRIMARY KEY与单列规格一起令人DELETE费解。这意味着Delete from temp where id2=100可能会删除多行。那么,批量删除之后是多个INSERTs? IODKU 可以实现这一点,并且同样高效,甚至可能更高效。
| 归档时间: |
|
| 查看次数: |
1810 次 |
| 最近记录: |