繁体   English   中英

Django:有关自动递增主键的最佳做法

[英]Django: Best practice regarding auto increment primary key

嗨,我正在构建一个Django应用程序,在此期间,我正在将测试上传到我的数据库中,然后删除数据。 我了解到,这样做时,下一次插入将在插入自动增量主键int时“从中断处开始”。

即:

我在表格“ Sample”中插入3行:

auto_id    |     sample 
  1        |    JSUDH172
  2        |    QIUWJ185
  3        |    PNMSY111

当我删除这些,然后再次输入时,它将从4开始:

auto_id    |     sample 
  4        |    JSUDH172
  5        |    QIUWJ185
  6        |    PNMSY111

我了解这是内置的,可以阻止Django覆盖主键,但是当主键不再存在时,(主要从表面的观点来看)它使我烦恼,它不会重置。 在此开发过程中,我正在将数千行记录上载到某些表中,因此有时它以数百/数千开头。

我知道我总是可以在开发完成之后从头开始重新启动项目,但是我想知道是否有人有任何有用的解决方法,或者人们是否只是按原样保留了它(如果他们和我有相同的看法)

谢谢

因此,有几种方法。 已经提到了其中一些。 首先,重要的是要知道。 在django模型字段上设置auto_increment时,它将转换为数据库命令。 当你跑步

python3 manage.py migrate

对于具有一个AUTO_INCREMENT字段的模型,它执行在像SQL命令

删除数据时,进入sql cli并手动将其重置。 但是,以非编程方式直接与数据库进行交互不是django方式,因此不应这样做。 在这种情况下,您必须删除所有数据并重置自动增量,可以说在生产环境中,我将通过./manage.py makemigrations theappname --empty创建迁移脚本。 并在迁移脚本中执行sql语句。

通常,整数主键的值基于数据库[1] [2]中的基础sequence ,该sequence允许唯一值的分配在所有多事务,多租户,多帐户,客户端服务器数据库的连接争吵荣耀。 安全地填充稀疏填充的ID序列中的间隙比“获取并增加”要复杂得多,并且对于约束是功能而非美观的列没有任何实际价值。

从实际的角度来看,在几乎所有情况下您都不会用完整数主键,因此实际上没有必要重用空闲的插槽。

如果您需要一个从零开始平滑填充的序列号,则可以为此使用另一列,并用另一种机制填充它,也许使用存储过程查找要与新行一起使用的最小可用值。

[1] https://www.postgresql.org/docs/10/static/sql-createsequence.html

[2] https://www.postgresql.org/docs/10/static/functions-sequence.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM