2014-08-28 3 views
0

В обычном случае мои 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. В этом случае - обычная таблица с входом только администратора. Может кто-нибудь просветить меня об этом?

+2

Вы почти наверняка вставив идентификаторами вручную где-нибудь. Где я не мог сказать, но вот где вы должны начать искать. –

+0

Интересно. @RichardHuxton: действительно ли вставка идентификаторов также вызывает сброс последовательности? Или это означало бы, что это было испорчено раньше? – vdboor

+0

Нет, что происходит, вы вставляете строки 1,2,3, используя последовательность, а затем выполняете 4,5 вручную. Следующий автоматически сгенерированный идентификатор будет 4, потому что он не знает, что вы сделали. Это дает ошибку. –

ответ

1

Обычно это происходит, когда вы (или кто-то) иногда записываете значения в id явно, вместо получения значений из последовательности (по умолчанию или с nextval()).

В вашем коде отсутствует пара круглых скобок.

SELECT setval('myapp_project_id_seq', (SELECT max(id) FROM myapp_project)); 

Это чуть-чуть короче & дешевле, делая то же самое, а именно:

SELECT setval('myapp_project_id_seq', max(id)) FROM myapp_project; 
Смежные вопросы