ОШИБКА: значение дублированного ключа нарушает ограничение уникальности в postgreSQL - PullRequest
4 голосов
/ 11 июля 2011

Я получаю уникальную проблему ограничения в postgresql при обновлении таблицы.У меня есть таблица с 3 столбцами и уникальным ограничением на один из столбцов (internal_state).В этой таблице будет только два столбца, а значения для internal_state равны 1,0.Запрос на обновление:

UPDATE backfeed_state SET internal_state = internal_state - 1<br> WHERE EXISTS (SELECT 1 FROM backfeed_state d2 WHERE d2.internal_state = 1 )

Выполнение этого запроса нормально в MSSqlserver, но в postgre выдает уникальную ошибку ограничения.Я понимаю, что в SQLServer после обновления всех строк проверяются только ограничения на столбцы, но в postgre после обновления каждой строки проверяются ограничения.Поэтому после обновления первой строки (значение internal_state от 1 до 0) postgre проверяет ограничение и выдает ошибку даже до обновления второй строки.

Есть ли способ избежать этой ситуации?

1 Ответ

5 голосов
/ 11 июля 2011

http://www.postgresql.org/docs/9.0/static/sql-createtable.html в разделе «Неотложенные ограничения уникальности» - «Когда ограничение UNIQUE или PRIMARY KEY не откладывается, PostgreSQL немедленно проверяет уникальность всякий раз, когда строка вставляется или изменяется».

Изменение вашего уникального ограничения на отложенное будет откладывать проверку до конца обновления. Либо используйте SET CONSTRAINTS, чтобы отключить на уровне сеанса (что раздражающе повторяется), либо удалите и заново создайте ограничение уникальности с опцией deferrable (мне не известна конструкция ALTER, чтобы сделать это без удаления).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...