【问题标题】:How to make id (primary key) of new created objects start from some value?如何使新创建的对象的 id(主键)从某个值开始?
【发布时间】:2021-07-03 12:26:18
【问题描述】:

我的项目中有一个现有的 django 模型,它已经在生产数据库 (PostgreSQL) 中并且有记录。

而我基本上想要的是将新创建的对象的id (autoincrement pk) 设置为至少有 5 位数字并从 5 开始。 因此,例如,如果我在数据库中有最后一条记录,id 为 1924,我希望我的下一个对象有 id 51925(最后一个 ID + 1 + 50000)。 所以它会是这样的:

older objects
...
1921
1922
1923
1924 # last in production
51925 # next object to be created must autoincrement from 50001 + previous id
51926
51927
.... and so on

有可能吗?最好的方法是什么? 谢谢

【问题讨论】:

  • 使用ALTER SEQUENCE ... RESTART WITH <yournumber>;。您需要自己查询上一个最大 ID,没有语法可以说“从表达式“从表中选择 max(id)+50000”的结果开始这个序列。
  • @AdamKG 谢谢,所以以前的记录还会有现有的 id 吗?只有新的会从我指定的数字开始?
  • 是的,没错。

标签: sql django postgresql


【解决方案1】:

感谢@AdamGK 的评论,我发现这个answer 有助于生成所需的 psql 命令:

python manage.py sqlsequencereset yourappname

运行后,我找到了我需要的模型(为了举例,我更改了应用程序和模型名称):

SELECT setval(pg_get_serial_sequence('"yourappname_modelname"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "yourappname_modelname";

然后将其更改为 (max id + 50000):

SELECT setval(pg_get_serial_sequence('"yourappname_modelname"','id'), coalesce(max("id") + 50000, 1), max("id") IS NOT null) FROM "yourappname_modelname";

它就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2023-01-08
    • 2017-08-08
    • 1970-01-01
    相关资源
    最近更新 更多