This question already has an answer here:
PostgreSQL gapless sequences
(1个答案)
7年前关闭。
我试图弄清楚为什么Django(或PostgreSQL,不确定是哪个级别)不重用已删除对象的主键。创建对象时,它们都具有一个ID值,该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个呢?
(1个答案)
7年前关闭。
我试图弄清楚为什么Django(或PostgreSQL,不确定是哪个级别)不重用已删除对象的主键。创建对象时,它们都具有一个ID值,该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个呢?
最佳答案
分配的主键通常基于序列,因为它更容易存储和计算序列中的单个值和下一个值。考虑一个有100万条记录的表,并删除了其中的5万条记录。要填写新打开的键值,您必须使用内存来存储这些选项,或者扫描表以获取最低的打开值。与仅分配序列中的下一个值相比,两者都非常昂贵。
关于django - 在删除具有该主键的对象之后,为什么Django/PostgreSQL不重用主键值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20082256/