Django i zduplikowane wartości kluczy
Internet 24th Jan 2011
Django przy współpracy z Postgresem odstawiło dzisiaj niezłą scenę. Galeria na stabilnie działającej od ponad roku stronie nagle wysypała się przy dodawaniu kolejnych zdjęć, pod pretekstem podwójnych wartości kluczy w tabeli przechowującej pliki galerii.
IntegrityError: duplicate key value violates unique constraint "galeria_plik_pkey"
No więc sprawdzam.
SELECT max(id) FROM galeria_plik;
1573
SELECT nextval('galeria_plik_id_seq'::regclass) FROM galeria_plik;
1526
Great Scott! WTF? Ktoś zakłócił kontinuum! Nie mam pojęcia jak stabilnie działający PostgreSQL mógł nagle tak machnąć się w numeracji... Jeżeli traficie na coś podobnego nie pozostaje nic innego jak zresetowanie indeksu tabeli z właściwym numerem, jaki powinien posiadać kolejny wiersz.
ALTER SEQUENCE galeria_plik_id_seq RESTART with 1574;
I powinno działać. Komuś zdarzyło się coś podobnego?
PS. Python jednak ryje beret. Dzisiaj ułożyłem takie oto zapytanie:
FROM galeria_plik SELECT max(id);
Komentarze z jogger.pl
mozna jeszcze zrobic to z zagniezdzonym zapytaniem np.:
SELECT setval('galeriaplikidseq', (SELECT max(id) FROM galeriaplik));
Bezpieczniej o tyle ze jezeli ktos cos zmienil w miedzyczasie mamy gwarancje ustrzymania maxymalnego id.
A co do podbicia recznego id. Moze jakis modul z django probuje inaczej nadawac PK? Standardowy panel admina raczej nie powinien tutaj syfu narobic aczkolwiek moze cos sie pozmienialo w ostatnich wersjach ;)