我正在试图找出为什么Django(或PostgreSQL,不确定它在哪个级别)不重用已被删除的对象的主键。创建对象时,它们都具有一个自动递增的id值,并按数据库中的id值排序。例如:
ID
5
4
3
2
1
假设我碰巧删除ID为5的对象:
ID
4
3
2
1
当我创建一个新对象时,它的ID为6:
ID
6
4
3
2
1
为什么不将“5”指定为刚刚创建的新对象的主键?为什么它有6个呢?
答案 0 :(得分:10)
指定的主键通常基于序列,因为它更容易存储和计算单个值以及序列中的下一个值。考虑一个包含100万条记录的表和一条删除5,000条记录的删除表。要填写新打开的键值,您必须使用内存来存储这些选项或扫描表格以获得最低的开放值。与仅分配序列中的下一个值相比,两者都很昂贵。