這是一個玩具示例,說明了PostgreSQL中的一個實際問題。下面的例子是使用PostgreSQL 8.4.3服務器,但我懷疑其他版本也有同樣的問題。在PostgreSQL中更新非空和唯一約束的列的特例
如下表:
=> 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;
作品。這個例子並不是最簡單的解決方案,但它可以很容易地推廣到更復雜的例子。
這是一個有趣的問題,但我不明白爲什麼你不想在那裏刪除。你已經創建了一個非常呃約束的約束集。你試圖解決的更大的問題是什麼? – Charles 2010-07-20 22:44:47