修改Django AutoField起始值

发布于 2024-12-05 19:13:54 字数 546 浏览 1 评论 0原文

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

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

现在,当我尝试使用 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))

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

I have and existing database, which I have migrated with SQLAlchemy to a new PostgreSQL database.

I moved all primary keys with the same values as before. Now I have tables filled with data, but the associated sequences starts from 1. I have pk values stored 1 to 2000.

Now, when I try to save something with Django, I have the

duplicate key value violates unique constraint
regarding to the Primary Key.

How can I modify the sequence start values or escape this situation?
My current solution is:

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

It works for me, but I don't like it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海夜未眠 2024-12-12 19:13:54

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

(不一定是 max(id))。

  • 这就是您在问题中提出的简单方法。您可以使用 setval() 将序列设置为从任意数字开始:

    SELECT setval('tbl_id_seq');
    

  • 然后是标准 SQL 方式 ALTER SEQUENCE做同样的事情:

    更改序列 myseq 用 1 重新启动;
    

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

    CREATE TABLE foo(id 序列号, 文本); -- 创建序列“foo_id_seq”
    插入 foo(a) 值('a'); -- 序。以 --> 开头1
    
    更改序列 foo_id_seq 从 10 开始; -- 不重新启动序列
    插入 foo(a) 值('b'); --> 2
    
    更改序列 foo_id_seq 重新启动; -- 重新启动序列
    插入 foo(a) 值('c'); --> 10
    
  • 还有另一种方法,当您使用 截断

    截断 foo 重新启动标识;
    

    隐式执行ALTER SEQUENCE foo_id_seq RESTART;

Ways to set / reset a sequence in PostgreSQL

(not necessarily to max(id)).

  • There's the simple way you have in the question. You can set the sequence to start at an arbitrary number with setval():

    SELECT setval('tbl_id_seq');
    
  • Then there's the standard SQL way with ALTER SEQUENCE doing the same:

    ALTER SEQUENCE myseq RESTART WITH 1;
    
  • If you like to restart your sequences at numbers other than the default 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
    
  • And there is another way, when you empty a table with TRUNCATE:

    TRUNCATE foo RESTART IDENTITY;
    

    Implicitly executes ALTER SEQUENCE foo_id_seq RESTART;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文