2011-11-03 15 views
5

我最近迁移数据库从MySQL向pgsql 9PostgreSQL的设置一张ID写入

但现在,当我尝试创建一个新的对象(Django管理),它告诉我,该ID我想使用(从一开始,每次尝试都增加)已经被使用。

我猜测有一个指针或索引需要设置为最后使用的ID。我对么?

+0

您可以将列的类型设置为'serial',postgreSQL将自动为您创建一个序列。 – Johan

+0

我几乎可以肯定它是由于表由django创建的。 – demux

+0

我在这里找到了答案:http://stackoverflow.com/questions/1709705/postgresql-nextval-generating-existing-values – demux

回答

7

当你定义你的表,PostgreSQL的相当于“AUTO_INCREMENT”是:

CREATE TABLE foo (
    id SERIAL, 
    ... 
); 

如果已经创建了表(我怀疑它是),你可以手动添加此:

CREATE SEQUENCE foo_id_seq; 
ALTER TABLE foo ALTER COLUMN id SET DEFAULT nextval('foo_id_seq'); 

请注意,如果你想坚持与PG 会给你使用以下格式为您的序列名称默认名称:

<table name>_<column name>_seq 

因此在我的例子中,foo_id_seq

+0

已经有一个由django创建的表和序列。所以我不必创建序列并修改表格。但是有效的是:select setval('uploads_id_seq',6965); (上传表名) – demux

2

如果表已迁移并使用串行来替换mysql自动增量列,则可能会迁移您的数据而不增加串行序列。查找postgresql setval函数,将您的序列设置为您的表中现有最高关键点以上的值。

+0

我在这里找到它:http://www.postgresql.org/docs/current/static/functions-sequence.html我是新来的postgresql;你能举个例子吗? – demux

+0

'SELECT setval('nameOfSequence',42);' – Ketema