使用Django重置Postgres数据库的主键

时间:2011-11-17 04:25:57

标签: django postgresql primary-key auto-increment

我遇到了可怕的表问题,因为我创建了自己的用户类而不是切换到默认的Django类。在无数令人头疼之后,我们决定干净python manage.py reset syncdb。创建了一个新用户,但User.id的主键计数器从前一个用户开始,这意味着在创建使用User.id作为主键的其他表时,它们总是处于关闭状态。

如何完全重写以便从1开始,或者更改计数器,使其现在为2(因为我创建了一个用户)?如果它涉及SQL,请告诉我在哪里放置它,因为我的应用程序托管在Heroku上。

谢谢!

3 个答案:

答案 0 :(得分:6)

默认情况下,Postgres会为类型serial创建的所有列创建新序列。 django auth用户的默认名称为auth_user,因此默认序列名称为auth_user_id_seq或类似名称。

您可以通过

找到下一个序列值
SELECT nextval('auth_user_id_seq');

您可以通过以下方式将其设置为1:

SELECT setval('auth_user_id_seq', 1);

答案 1 :(得分:1)

解决此问题的最简单方法(不删除整个数据库)是使用psql或sql客户端连接数据库(如此http://www.sqlmanager.net/en/products/postgresql/manager,有免费的轻量版本)。然后发出以下命令:

truncate <user_table> reset identity

然后你可以重新填充数据库

实际上,您实际上也可以通过使用来自django shell的原始查询来执行此操作:https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

答案 2 :(得分:0)

要重置所有内容,请删除数据库,重新创建它并运行syncdb以重新创建表。

要仅重置增量计数器,此问题应该有用:How to reset postgres' primary key sequence when it falls out of sync?

您所说的“在创建使用User.id作为主键的其他表时,它们总是关闭14个”。令人担忧您不是依赖每个表上的自动递增主键来表示关系,是吗?