【问题标题】:Modify Django AutoField start value修改 Django AutoField 起始值
【发布时间】:2011-11-22 04:50:24
【问题描述】:

我已经使用 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))

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

【问题讨论】:

    标签: django postgresql auto-increment django-south


    【解决方案1】:

    在 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;

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 2016-02-01
      • 2018-03-05
      • 2018-12-12
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多