В обычном случае мои Django webapps создают ошибки SQL в таблицах M2M.Последовательность PostgreSQL сбрасывается?
Каждый раз, когда оказывается, последовательность идентификаторов сбрасывается до значения в диапазоне существующих строк.
приложение выполняет обычные запросы SQL, такие как:
INSERT INTO "myapp_project" ("name") VALUES ('test1') RETURNING "myapp_project"."id"'
, которые вызывают ошибки, такие как:
IntegrityError: duplicate key value violates unique constraint "myapp_project_pkey"
DETAIL: Key (id)=(29) already exists.
Тогда получается, что myapp_project_id_seq
указывает на старый ID номер:
select currval('myapp_project_id_seq')
29
Которые можно сбрасывать с помощью:
select setval('myapp_project_id_seq', (select max(id) from myapp_project))
Однако я не могу объяснить, почему это происходит. Обычно это происходит на таблицах M2M в Django. В этом случае - обычная таблица с входом только администратора. Может кто-нибудь просветить меня об этом?
Вы почти наверняка вставив идентификаторами вручную где-нибудь. Где я не мог сказать, но вот где вы должны начать искать. –
Интересно. @RichardHuxton: действительно ли вставка идентификаторов также вызывает сброс последовательности? Или это означало бы, что это было испорчено раньше? – vdboor
Нет, что происходит, вы вставляете строки 1,2,3, используя последовательность, а затем выполняете 4,5 вручную. Следующий автоматически сгенерированный идентификатор будет 4, потому что он не знает, что вы сделали. Это дает ошибку. –