gpt4 book ai didi

django - 为什么不显式设置 AutoField 的值会增加表序列?

转载 作者:行者123 更新时间:2023-11-29 12:58:35 25 4
gpt4 key购买 nike

在 Django 1.8.11 中,使用 PostgreSQL 后端,如果我有一个包含 3 个项目的表(id 为 1、2、3),我像这样手动插入一个项目,明确指定 id:

i = MyItem(id = 10, field1 = "foo")
i.save()

我注意到表的 AutoField 序列的下一个值没有更新:

>> select nextval('myapp_myitem_id_seq')
4

这是设计使然吗?我看到 this question这告诉我如何重置序列,但为什么序列首先会不同步?这个例子中sequence不是应该设置为11吗?

最佳答案

这确实是设计使然。序列只是数据库中与表分开的另一个对象。顾名思义,它是数据库生成算术数列的一种方式。它可以链接到一个表,并且经常用于自动生成 ID 值,但这并不是它唯一可以用来做的事情。 (请注意,这与某些其他数据库处理 AutoFields 的方式不同,例如 MySQL 的 AUTO_INCREMENT 标志。AUTO_INCREMENT 只能用于 ID 字段,而序列更多一般。是的,其他数据库仍然会完全忽略您为 ID 字段指定的任何值,除非您明确要求数据库不要事先忽略该值 – 你好,MS SQL,我说的是你。)

每当您需要将现有数据(包括自动 ID 值)导入数据库时​​,您必须确保之后更新与所有相关表关联的序列。没有魔法可以在每个 INSERT 语句上自动执行此操作,至少默认情况下不会。 (我想您可以使用触发器实现某种效果,但我从未尝试过类似的东西。)

顺便说一下,PostgreSQL wiki 包含 a very useful recipe修复数据库中的所有序列,我没有在您链接的问题中看到引用(至少没有快速浏览)。

关于django - 为什么不显式设置 AutoField 的值会增加表序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36486154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com