Временно отключить ограничение первичного ключа

big-trot
Дата: 24.12.2014 16:12:52
Добрый день.

Есть таблица, в которой имеется составной ключ, например "идентификатор контракта" и "год исполнения".
Выполняется операция UPDATE по всей таблице, поле "год исполнения" увеличивается на единицу для всех контрактов, например

UPDATE table1 SET year = year + 1


При выполнении данной команды получаем ошибку, например

ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "table1_idx"
DETAIL: Ключ "(year, id_contract)=(2016, 3305)" уже существует.

Если допустить, что команда выполнилась бы, то в итоге нарушения уникальности не было бы.

Вопрос, как на время выполнения команды, блокировать контроль на ограничение уникальности?
Есть решение удалить ключ и после его создать, но мне кажется это не лучшее решение. Есть ли другие варианты?
Спасибо
Gold_
Дата: 24.12.2014 18:57:23
big-trot
...

Вопрос, как на время выполнения команды, блокировать контроль на ограничение уникальности?
Есть решение удалить ключ и после его создать, но мне кажется это не лучшее решение. Есть ли другие варианты?
Спасибо



ALTER TABLE table1
  ADD CONSTRAINT table1_cont UNIQUE (year, id_contract) DEFERRABLE;



Но можно и в одной транзакции удалить, обновить, создать. Это же разовая операция?
NikolayV81
Дата: 24.12.2014 20:29:28
big-trot
Добрый день.

Есть таблица, в которой имеется составной ключ, например "идентификатор контракта" и "год исполнения".
Выполняется операция UPDATE по всей таблице, поле "год исполнения" увеличивается на единицу для всех контрактов, например

UPDATE table1 SET year = year + 1


При выполнении данной команды получаем ошибку, например

ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "table1_idx"
DETAIL: Ключ "(year, id_contract)=(2016, 3305)" уже существует.

Если допустить, что команда выполнилась бы, то в итоге нарушения уникальности не было бы.

Вопрос, как на время выполнения команды, блокировать контроль на ограничение уникальности?
Есть решение удалить ключ и после его создать, но мне кажется это не лучшее решение. Есть ли другие варианты?
Спасибо


отсортировать по дате назад и обновить в цикле