您好我正在构建一个Django应用程序,在此期间我正在测试上传到我的数据库,然后删除数据。据我所知,当我这样做时,下一个插入将在插入自动增量主键int时“拾取它停止的位置”。
即:
我在表'Sample'中插入3行:
auto_id | sample
1 | JSUDH172
2 | QIUWJ185
3 | PNMSY111
当我删除这些并再次输入时,它将从4开始:
auto_id | sample
4 | JSUDH172
5 | QIUWJ185
6 | PNMSY111
我知道这是为了阻止Django覆盖主键而内置的,但是当主键不再存在时,它(主要是从肤浅的角度来看)让我感到恼火,它不会重置。我在开发过程中将数千行上传到某些表中,因此有时它会以数百/数千的速度启动。
我知道在开发完成后我总是可以“从头开始”重新启动项目,但我想知道是否有人有任何有用的解决方法,或者是否有人将其保留原样(如果他们和我有相同的视图)< / p>
感谢
答案 0 :(得分:0)
所以有一些方法。其中一些已经提到过。首先,重要的是要知道。虽然在django模型字段上设置了auto_increment,但它会转换为数据库命令。当你运行
python3 manage.py migrate
对于具有auto_increment字段的模型,它在sql命令中执行,如this
删除数据时,请进入sql cli并重置manually。但是,以非程序方式直接与数据库交互,不是django方式,不应该这样做。在这种情况下,你必须删除所有数据并重置自动增量,让我们说生产,我会通过./manage.py makemigrations theappname --empty
创建一个迁移脚本。并在迁移脚本中执行sql语句。
答案 1 :(得分:0)
通常,整数主键的值基于数据库[1] [2]中的基础sequence
,它允许以在所有多事务下安全的方式分配唯一值,多租户,多连接的racey荣耀,这是一个客户端 - 服务器数据库。安全地填充稀疏填充的ID序列中的间隙比“获取和增加”要复杂得多,并且对于约束功能而非美学的列没有任何实际价值。
从实际角度来看,几乎在所有情况下都不会耗尽整数主键,因此实际上不需要重复使用空闲插槽。
如果您需要一个从零平滑填充的序列号,也许您可以为此目的使用另一列并使其由另一种机制填充,可能使用存储过程来查找与新行一起使用的最小可用值
[1] https://www.postgresql.org/docs/10/static/sql-createsequence.html
[2] https://www.postgresql.org/docs/10/static/functions-sequence.html