Poprawianie błędnej wartości sekwencji
August 14th, 2009 | by litestep |Wczoraj, podczas refaktoryzacji starego kodu, przy wstawianiu wierszy do tabeli otrzymałem następujący błąd:
ERROR: duplicate key violates unique constraint “mytable_pkey”
Wydawało mi się to dziwne, w końcu struktura tabeli była następująca:
mytable (
id SERIAL PRIMARY KEY
[...]
)
Po upewnieniu się, że nie podaje żadnego id podczas komendy insert zacząłem szukać potencjalnej przyczyny tego błędu. Okazała się bardzo prosta lecz niespodziewana – wartość sekwencji używanej do pobierania kolejnych id była mniejsza niż maksymalna wartość id w istniejących wierszach.
Na szczęście można to łatwo naprawić:
select setval('mytable_id_seq', (select max(id) from mytable)) ;
Przy okazji moich poszukiwań znalazłem patch do Postgresa 8.4 który daje bardziej czytelne komunikaty o takich błędach, więc można się spodziewać, że w 8.5 będzie już łatwiej :)