gpt4 book ai didi

django - 修改 Django AutoField 起始值

转载 作者:行者123 更新时间:2023-11-29 11:54:38 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

(不一定是 max(id))。

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

    SELECT setval('tbl_id_seq');
  • 然后是标准 SQL 方式 ALTER SEQUENCE做同样的事情:

    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;

关于django - 修改 Django AutoField 起始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7504513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com