PostgreSQL设置下一个要写入的ID

5
我最近将一个数据库从mysql迁移到pgsql 9。但是现在,当我试图创建一个新对象(在django管理界面中),它告诉我我正在尝试使用的id(从1开始并每次递增)已经被使用了。我猜测有一个指针或索引需要设置为上次使用的id。我猜对了吗?

您可以将列的类型设置为“serial”,postgreSQL会自动为您创建一个序列。 - Johan
我几乎可以确定它是这样的,因为该表是由Django创建的。 - demux
我在这里找到答案:https://dev59.com/U0rSa4cB1Zd3GeqPUj2m - demux
2个回答

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

Django已经创建了一个表和序列,因此我不需要再创建序列和修改表。但以下方法可行:选择select setval('uploads_id_seq', 6965);(其中'uploads'是表名)。 - demux

2

如果表已经迁移并且使用 serial 替代 mysql 的自增列,则您的数据可能在不递增序列的情况下进行了迁移。请查找 PostgreSQL 的 setval 函数,将序列设置为高于表中最高现有键值的值。


我在这里找到了它:http://www.postgresql.org/docs/current/static/functions-sequence.html 我是postgresql的新手,你能给我展示一个例子吗? - demux
SELECT setval('nameOfSequence', 42); - Ketema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接