barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

суббота, 28 апреля 2012 г.

PostgreSQL: поля serial и "ERROR: duplicate key value" при вставке

Проблема:

При вставке строки в таблицу (пусть она называется "mytable"), использующую поле типа "serial" (пусть оно называется "id", а соответствующий ему ключ - "id_pkey") в качестве первичного ключа, появляется ошибка:
ERROR:  duplicate key value violates unique constraint "id_pkey"
, хотя в запросе явно это поле не задается и вроде бы должно быть автоматически взято из соответствующей последовательности (пусть она называется "id_sequence").

Причина:

Последовательность, используемая для генерации поля "id_pkey", почему-то выдала значение, которое уже есть в таблице. Такое может случиться, например, если в какой-то строке таблице значение "id_pkey" задавалось / редактировалось вручную, в обход последовательности. 

Решение:

Можно просто попробовать повторить вставку на случай, если следующее значение последовательности не приведет к ошибке. Или же восстановить последовательность:
select setval(' id_sequence', (select max( id ) + 1 from  mytable));
Другой вариант - выполнить:
REINDEX INDEX  id_pkey; 
Спасибо http://vasilec.blogspot.com/2010/04/duplicate-key-value-violates-unique.html за подсказку. 

Комментариев нет:

Отправить комментарий