我正在使用mysql,我正在看一个奇怪的行为。
场景:
我有table_id
作为primary key
的表格,其设置为auto-increment
。
table_id more_columns
1 some value
2 others
现在,如果我删除第2行,再插入一行,则table_id变为3(预期为2)
table_id more_columns
1 some value
3 recent
为什么会这样?在这里,我失去了一些ids(我知道它们并不重要)。请对此行为进行一些说明
答案 0 :(得分:1)
在自动增量字段中如果删除了某行,则不会重新分配该行的auto_increment
列。
有关详细信息,请参阅here。
为什么自动增量不使用已删除的值的原因可以refer here(@AaronBlenkush的评论中提到)。
答案 1 :(得分:0)
MySQL auto_increment
列在内部维护一个数字,并且即使在删除后也会一直增加它。如果您需要填写空白区域,则必须自己在PHP中处理它,而不是在表定义中使用auto_increment
关键字。
如果要维护外键关系,回滚以填充空行id会导致各种困难,并且确实不建议。
可以使用SQL语句重置auto_increment
,但不建议这样做,因为它会导致重复的键错误。
-- Doing this will cause problems!
ALTER table AUTO_INCREMENT=12345;
修改强> 要按照注释中的说明强制执行外键关系,您应该添加到表定义中:
FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL;
填写正确的表格和列名称。现在,当从注册中删除用户时,他们的朋友关联将被清零。如果您需要与其他用户重新关联,则必须使用PHP进行处理。 mysql_insert_id()
不再有用。
如果您需要在删除后仍然在数据库中找到编号最高的ID以与朋友关联,请使用以下内容。
SELECT MAX(id) FROM registration_table;
删除后写下此查询
ALTER TABLE tablename AUTO_INCREMENT = 1
答案 2 :(得分:0)
auto_increment值是每个表内部存储的计数器。柜台只会增加,永不减少。 针对该表触发的每个语法正确的INSERT语句都会递增此计数器,即使它已回滚,也为您定义主键的插入值。