在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吗?
答案 0 :(得分:2)
确实是设计上的。序列只是数据库中与表分离的另一个对象。它实际上正是它所说的 - 数据库生成数字算术序列的一种方式。它可以链接到表,并且经常用于自动生成ID值,但这不是它可以用于的唯一事物。 (请注意,这与其他一些数据库处理AutoFields的方式不同,例如MySQL的AUTO_INCREMENT
标志。AUTO_INCREMENT
只能用于ID字段,而序列更通用。是的,等等数据库仍将完全忽略您为ID字段指定的任何值,除非您明确要求数据库不要事先忽略该值 - 您好,MS SQL,我在谈论您。)
每当您需要将现有数据导入数据库(包括自动ID值)时,您必须确保随后更新与所有相关表关联的序列。没有魔法可以在每个INSERT语句上自动执行此操作,至少在默认情况下不会。 (我想你可以使用触发器实现某种效果,但我从来没有尝试过类似的东西。)
顺便说一句,PostgreSQL wiki包含a very useful recipe来修复数据库中的所有序列,我在你链接的问题中没有看到引用(至少不是很快)一目了然)。