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 :)

Post a Comment