Задать вопрос
@ksvdon

Как обойти ошибку ERROR: duplicate key value violates unique constraint?

Делаю update времени:
update sometable set ts = ts + $Date_dif

в таблице sometable есть поле ts:
Column | Type | Modifiers | Storage | Description
---------------------------+-----------------------+-----------+----------+-------------
ts | integer | not null | plain |

оно же помечено как PRIMARY KEY (и не только оно)

в ts записано время в формате unix_time. Я прибавляю ко всем значениям поля ts некую разницу в формате unix_time и таким образом обновляю время в БД будто данные были записаны недавно.

Первый раз у меня всё вышло. Когда я пробовал обновить время ещё раз - выдавало ошибку:
ERROR: duplicate key value violates unique constraint

Как можно обойти это? (аналогичная проблема с и БД MySQL, выдает что-то вроде: ERROR 1062 (23000) at line 1: Duplicate entry '1439933444-stat-localhost' for key 'PRIMARY' )

Как обойти? Есть варианты? Мне надо иметь возможность обновлять данные столько раз сколько потребуется.
  • Вопрос задан
  • 23330 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
nazarpc
@nazarpc
Open Source enthusiast
Обновляйте, только дубликаты не создавайте, написано же человеческим языком в ошибке.
Можно (нужно) перед обновлением убедиться что обновление вообще возможно.
Ответ написан
Комментировать
magnitudo
@magnitudo
Архитектор, программист, предприниматель...
Я думаю, что проблема в том, что при обновлении записей в какой-то момент времени появляются дубликаты (т.е. было поле 3 и 6, делаем +3 и сначала нам попадает поле 3, т.е. там будет 6, что конфликтует с уже имеющейся 6).
Вам нужно либо изменить PRIMARY KEY на DEFERRABLE (чтобы проверка выполнялась при завершении транзакции), либо обновлять данные в отсортированном виде, т.е. сначала прибавлять к самым новым записям в таблице.
Ответ написан
Комментировать
cinic
@cinic
В Postgresql 9.5 можно использовать ON CONFLICT DO NOTHING.
Ответ написан
Комментировать
@1Spagetti
TRUNCATE TABLE youtable CONTINUE IDENTITY CASCADE; очистить данные таблиц с трункейтом потом делать реплоикацию
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы