为什么不明确设置AutoField的值会增加表序列?

时间:2016-04-07 20:05:52

标签: django postgresql

在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告诉我如何重置序列,但为什么序列首先不同步?在这个例子中,不应该将序列设置为11吗?

1 个答案:

答案 0 :(得分:2)

确实是设计上的。序列只是数据库中与表分离的另一个对象。它实际上正是它所说的 - 数据库生成数字算术序列的一种方式。它可以链接到表,并且经常用于自动生成ID值,但这不是它可以用于的唯一事物。 (请注意,这与其他一些数据库处理AutoFields的方式不同,例如MySQL的AUTO_INCREMENT标志。AUTO_INCREMENT只能用于ID字段,而序列更通用。是的,等等数据库仍将完全忽略您为ID字段指定的任何值,除非您明确要求数据库不要事先忽略该值 - 您好,MS SQL,我在谈论您。)

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

顺便说一句,PostgreSQL wiki包含a very useful recipe来修复数据库中的所有序列,我在你链接的问题中没有看到引用(至少不是很快)一目了然)。