首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改Django AutoField开始值

修改Django AutoField开始值
EN

Stack Overflow用户
提问于 2011-09-21 18:07:41
回答 1查看 3.5K关注 0票数 2

我有和现有的数据库,我已经用SQLAlchemy迁移到一个新的PostgreSQL数据库。

我用与以前相同的值移动了所有主键。现在我有了充满数据的表,但是相关的序列从1开始,我将pk值存储在1到2000之间。

现在,当我试图用Django保存一些东西时,我有

重复键值违反了对主键的唯一约束。

如何修改序列开始值或避免这种情况?

我目前的解决办法是:

代码语言:javascript
复制
conn = psycopg2.connect(...)
    for table_name in table_names:

        cursor = conn.cursor()
        cursor.execute("""
        SELECT setval('%s_id_seq', (SELECT COALESCE(MAX(id),0)+1 FROM %s));
        """% (table_name, table_name))

对我有用,但我不喜欢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-04 23:46:50

在PostgreSQL中设置/重置序列的方法

(不一定是max(id))。

  • ,你在这个问题上有一个简单的方法。您可以使用setval()将序列设置为以任意数字开始:

选择setval('tbl_id_seq');

  • Then,这是使用ALTER SEQUENCE进行相同操作的标准SQL方式:ALTERSequencemyseqwith1;

  • ,如果您想在默认的1以外的数字上重新启动序列:

创建表foo(id串行,文本);--创建序列"foo_id_seq“插入foo(a)值(‘a’);-- seq。从->1 foo_id_seq开始,从10开始;--不重新启动序列插入到foo(a)值(‘b’);->2 foo_id_seq重新启动序列插入到foo(a)值(‘c’);->10

  • ,还有另一种方法,当您用TRUNCATE清空表时:

截断foo重新启动标识;

隐式执行ALTER SEQUENCE foo_id_seq RESTART;

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7504513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档