Это игрушечный пример, который иллюстрирует реальную проблему в PostgreSQL. Приведенные ниже примеры используют сервер PostgreSQL 8.4.3, но я подозреваю, что другие версии имеют ту же проблему.
С учетом следующей таблицы:
=> create table tmp_foo (foo boolean not null unique, bar boolean not null unique);
=> insert into tmp_foo (foo, bar) values (true, true), (false, false);
=> select * from tmp_foo;
foo | bar
-----+-----
t | t
f | f
можно ли изменить таблицу так:
=> select * from tmp_foo;
foo | bar
-----+-----
t | f
f | t
без удаления строк или изменения схемы таблицы? Это:
=> update tmp_foo set bar = not bar;
ERROR: duplicate key value violates unique constraint "tmp_foo_bar_key"
не работает.
Если удаление разрешено, это:
=> create temp table tmp_foo_2 as select * from tmp_foo;
=> update tmp_foo_2 set bar = not bar;
=> delete from tmp_foo;
=> insert into tmp_foo select * from tmp_foo_2;
работает. Это не самое простое решение для этого примера, но его легко обобщить на более сложные примеры.