1
3
不,除非INSERT执行表锁,否则无法执行此操作。原因是INSERT必须计算到目前为止您要为其插入一行的各个公司的最大值。具有最大值的行可以在表中的任何位置。INSERT必须在防止任何其他INSERT并发运行的同时搜索它,否则会出现争用条件。 INSERT对InnoDB表不支持此表锁定行为。InnoDB可以执行自动递增,只允许并发INSERT,因为它跟踪每个表的一个最大值,并且只递增,不会向后移动或“撤消”递增。 当使用复合主键时,MyISAM支持按不同值递增的功能。毕竟,MyISAM已经为INSERT或其他更新做了表锁。在我看来,这一特性不足以证明使用MyISAM的正当性。 正如@sgeddes上面所评论的,这样做的价值无论如何都值得怀疑。当出现间隙时,例如删除一行或回滚INSERT时,您会怎么做?是否必须对主键重新编号,从而可能更新数千行?是否尝试将后续行插入间隙?这将需要另一个表锁,在执行此操作时搜索间隙并阻止其他插入。 主键不是行号。 不要把它当一回事。主键必须具有唯一值,但不能是连续值。 关于你的评论:不,你不应该认为自动递增的数字有任何意义,甚至连创建的顺序都没有。首先,auto inc值的顺序并不总是提交行的顺序。 最好对Rails告诉您的关于数据库的任何信息都持保留态度。Rails的设计者真的、真的希望数据库开发比现在更简单。Rails在过去10年里给开发人员带来了巨大的伤害。 |
Community wiki · SQL语法新手 1 年前 |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |