我在MySQL中使用InnoDB有一个表,其中一个列的名称为“id”。
所以我的问题是每当我从表中删除最后一行然后插入一个新值时,新值就会在删除的id之后插入。
我的意思是假设我的id是32,我想删除它,然后如果我在删除后插入一个新行,那么列id自动递增到33.所以串行格式被破坏,即id = 30, 31,33和没有32。
因此,在删除最后一栏后插入时,请帮我分配ID 32而不是33。
答案 0 :(得分:16)
简短回答:不。
为什么?
我高度建议您不要浪费时间!这真的非常容易出错。
答案 1 :(得分:4)
关于关系数据库的工作原理,你有两个主要的误解:
不要依赖主键列中的连续值。
不要尝试max(id)+1
方法。它将无法在具有多个事务的系统中工作。
答案 2 :(得分:3)
你应该停止对抗这一点,即使使用SELECT max(id)
使用像Innodb这样的事务数据库引擎也无法正确解决这个问题。
为什么你会问?想象一下,你有两个交易,A和B,几乎同时开始,都做INSERT。第一个事务A需要新行id
,并且它将从与此表关联的不可见序列(称为AUTOINCREMENT值)中使用它,例如21.另一个事务B将使用另一个连续值(比如22) - 到目前为止好。
但是,如果交易A回滚怎么办?值21无法重用,22已经提交。如果有10个这样的交易怎么办?
并且max(id)
可以为A和B分配相同的值,因此这也是无效的。
答案 3 :(得分:0)
我想你的意思是“每当我删除表格的最后一行”时,不是吗?
无论如何,这就是自动增量的工作原理。这是为了保持正确的数据关系。如果在另一个表中使用已删除的记录的id,则在查询该id时获取错误更为正确,而不是获取另一条记录。
无论如何here你可以看到如何获得字段中的第一个免费ID。