如何在表上放置约束以确保表的子集中只有一个布尔列为真?

时间:2015-12-08 22:56:04

标签: sql database postgresql

我想知道如何将特定的布尔列限制为仅对表中的某个行子集为true。

在下面的示例中,对于元组(id2, 1d3)具有相同值的行,在默认列中只应有一个为true:

$> SELECT * FROM records WHERE id2 = 2 AND id3 = 3;
$>   id  |  id2  |  id3  |  name  |  default
   ------+-------+-------+--------+---------
      1  |  2    |   3   |  bob   |  false
      2  |  2    |   3   |  jane  |  false
      3  |  2    |   3   |  jim   |  false
      4  |  2    |   3   |  cory  |  true
      5  |  2    |   3   |  alan  |  false


$> SELECT * FROM records WHERE id2 = 4 AND id3 = 5;
$>   id  |  id2  |  id3  |  name  |  default
   ------+-------+-------+--------+---------
      6  |  4    |   5   |  bill  |  false
      7  |  4    |   5   |  fred  |  false
      8  |  4    |   5   |  frank |  false
      9  |  4    |   5   |  dave  |  true
     10  |  4    |   5   |  ryan  |  false

2 个答案:

答案 0 :(得分:3)

您可以使用部分唯一索引来执行此操作:

create unique index on records (id2, id3) where "default";

请注意default是保留字,因此对于列名称来说是一个非常糟糕的选择。

答案 1 :(得分:0)

有一个单独的表,其中一行包含所需行的mainOfferName。然后查询为:

select yt.*, (nt.id is not null) as valueFlag from records yt left join
 newtable nt
 on yt.id = nt.id;

如果要更改值,请更改newtable中的值。

注意:您可以将查询放入视图中,只读用户也可以使用。

并且,您可以在update上使用records触发器实现此功能。它不会更新records,而是更新newtable。