修改Django AutoField的起始值

时间:2011-09-21 18:07:41

标签: django postgresql auto-increment django-south

我有现有的数据库,我已将SQLAlchemy迁移到新的PostgreSQL数据库。

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

现在,当我尝试用Django保存时,我有

  

重复键值违反了唯一约束   关于主键。

如何修改序列起始值或逃避这种情况?
我目前的解决方案是:

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))

它对我有用,但我不喜欢它。

1 个答案:

答案 0 :(得分:7)

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

(不一定是max(id))。

  • 在问题中你有简单的方法。您可以使用setval()

    将序列设置为以任意数字开头
    SELECT setval('tbl_id_seq');
    
  • 然后是ALTER SEQUENCE执行相同的标准SQL方式:

    ALTER SEQUENCE myseq RESTART WITH 1;
    
  • 如果您想以默认值1以外的数字重新启动序列:

    CREATE TABLE foo(id serial, a text);      -- creates sequence "foo_id_seq"
    INSERT INTO foo(a) VALUES('a');           -- seq. starts with --> 1
    
    ALTER SEQUENCE foo_id_seq START WITH 10;  -- doesn't restart sequence
    INSERT INTO foo(a) VALUES('b');           --> 2
    
    ALTER SEQUENCE foo_id_seq RESTART;        -- restarts sequence
    INSERT INTO foo(a) VALUES('c');           --> 10
    
  • 当您使用TRUNCATE清空表时,还有另一种方法:

    TRUNCATE foo RESTART IDENTITY;
    

    隐式执行ALTER SEQUENCE foo_id_seq RESTART;