【发布时间】:2011-03-18 17:05:34
【问题描述】:
这是一个说明 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;有效。对于这个例子来说,这不是最简单的解决方案,但它很容易推广到更复杂的例子。
【问题讨论】:
-
这是一个有趣的问题,但我不明白你为什么不想在那里删除。您已经创建了一组非常,呃,受限的约束。您要解决的更大的问题是什么?
标签: sql postgresql constraints unique-constraint