Изменить начальное значение Django AutoField - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть и существующая база данных, которую я перенес с 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 Ответ

7 голосов
/ 05 октября 2011

Способы установки / сброса последовательности в 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;

...