这是一个玩具示例,说明了 PostgreSQL 中的一个实际问题。以下示例使用的是 PostgreSQL 8.4.3 服务器,但我怀疑其他版本也有同样的问题。
给定下表:
=> 创建表 tmp_foo (foo boolean not null unique, bar boolean not null unique); => 插入 tmp_foo (foo, bar) 值 (true, true), (false, false); => 从 tmp_foo 中选择 *; 富 | 酒吧 -----+----- 吨 | 吨 f | F
可以将表格修改为如下所示:
=> 从 tmp_foo 中选择 *; 富 | 酒吧 -----+----- 吨 | F f | 吨
不删除行或修改表架构?这个:
=> 更新 tmp_foo 设置 bar = not bar; 错误:重复键值违反唯一约束“tmp_foo_bar_key”
不起作用。
如果允许删除,则:
=> create temp table tmp_foo_2 as select * from tmp_foo; => 更新 tmp_foo_2 设置 bar = not bar; => 从 tmp_foo 中删除; => 插入 tmp_foo select * from tmp_foo_2;
作品。对于这个例子来说,它不是最简单的解决方案,但它很容易推广到更复杂的例子。