2009-02-13 90 views
20

我一直在Django的应用程序工作。首先,为了简单起见,我一直在使用sqlite3作为数据库。Django + PostgreSQL:如何重置主键?

但是,一旦我转移到PostgreSQL,我遇到了一些问题:一旦我清除表的主键不会重置。

这个程序是一个长时间(星期)播放的游戏。因此,每次新游戏开始时,所有数据都会从数据库中清除,然后添加新的随机数据。

我希望每次清理/重建游戏时都能够从主键开始1“重新开始”。

该代码仍然按原样运行,但整数是描述游戏中对象的非常自然的方式。我希望每个新游戏都从1开始,而不是上一次游戏中断。

如何在PostgreSQL中重置主键计数器?请记住,我不需要保留表中的数据,因为无论如何我都会清除它。

+0

我想我可以诉诸只是删除表,然后重新创建它,但我宁愿不要如果可以避免... – 2009-02-13 05:59:44

+0

我自己丢下了桌子......我花了太多时间试图弄清楚 – fuentesjr 2009-02-13 07:12:43

回答

25

在你的app目录试试这个:

python manage.py help sqlsequencereset 

管成这样PSQL实际运行复位:

python manage.py sqlsequencereset myapp1 myapp2 | psql 

编辑:这里是从这输出的例子命令在我的一张桌子上:

BEGIN; 
SELECT setval('"project_row_id_seq"', coalesce(max("id"), 1), max("id") IS NOT null) FROM "project_row"; 
COMMIT; 
0
+0

似乎没有工作......删除所有的数据,但主键仍然开始他们的位置之前离开。例如,如果我插入500行,则截断表,然后插入另一个500,主键将从501到1000,而不是从1-500。 – 2009-02-13 05:58:16

+0

嗯,试试这个:ALTER TABLE theTableInQuestion AUTO_INCREMENT = 0 – superUntitled 2009-02-13 06:35:53

1

我查看自动递增主键作为数据库记录的纯粹内部标识符,我不喜欢将它们公开给用户。当然,将它们作为URL的一部分使用是一种常见的设计,但即使有slug或其他标识符也更合适。