假设我想使用MySQL w / MyISAM引擎从表中选择一个最大值,然后根据此值插入一个新记录,其最大值为+ 1 (在对其应用转换后) 。我不希望任何其他事务同时发生,读取相同的最大值,然后尝试插入相同的新记录。
如何防止这种情况发生?
我需要LOCK整张桌子,还是什么?
要明确的是,我非常肯定我不能在AUTO_INCREMENT
使用{{1}},除非我可以将其执行的操作重新定义为比“加一”更复杂的操作。
答案 0 :(得分:3)
LOCK TABLES `tbl` WRITE;
INSERT INTO `tbl` (`id`, `foo`) SELECT MAX(`id`)+1, 'bar' FROM `tbl`;
UNLOCK TABLES;
但如果它是标准主键/ ID类型字段,则应使用AUTO_INCREMENT
。