创建包含操作的唯一PostgreSQL索引

创建包含操作的唯一PostgreSQL索引,sql,postgresql,postgresql-9.1,Sql,Postgresql,Postgresql 9.1,我想创建一个包含操作的唯一PostgreSQL索引。有人知道这是否可能吗 CREATE UNIQUE INDEX ux_data ON table (name, color) 我想添加的操作是“num&new_num=0”,其中num是一个现有列,new_num是一个要插入的值 这可能吗 CREATE UNIQUE INDEX ux_data ON table (name, color) 更新:以下是关于我想做什么的更多细节 数据库: name color num one

我想创建一个包含操作的唯一PostgreSQL索引。有人知道这是否可能吗

CREATE UNIQUE INDEX ux_data ON table (name, color)
我想添加的操作是“num&new_num=0”,其中num是一个现有列,new_num是一个要插入的值

这可能吗

CREATE UNIQUE INDEX ux_data ON table (name, color)
更新:以下是关于我想做什么的更多细节

数据库:

name    color    num
one     red      5
two     green    5
one     red      8
我想做的是防止出现条目不唯一的情况,例如:

新条目1:name=one,color=red,num=1

我们有匹配的名称和颜色,第一个num检查结果为101&001=1,这个新条目1不是唯一的,但是如果数字更改为2,则应该拒绝

新条目2:name=one,color=red,num=2


现在我们有了匹配的名称和颜色。对于所有名称/颜色中的num匹配101&010=0和1000&0010=0,因此我们有一个唯一的条目。

这将是一个半项目。看起来没有一种非常简单的方法可以做到这一点,但是使用PostgreSQL,任何事情都是可能的。我想您需要使用GIST的排除约束。不幸的是,排除约束并不容易实现,因为没有简单的类型支持它

我认为您的基本解决方案必须包括:

  • 转换为合适的数据类型(可能是位(n))

  • 足够的运算符允许位(n)的GiST索引。这意味着您必须为所有GiST操作类构建函数和运算符,创建运算符族等

  • 使用您的操作创建排除约束


  • 这不是一件容易的事,也会很复杂,但只要付出一些努力和奉献,这是可能的。我希望这样做会涉及到一到两百行代码。您可能也想编写单元测试

    这听起来更像是一个检查约束而不是索引。如果可以使用检查约束来完成,我也会这样做。我只是不知道是否可以检查一下。如下所示:在base.ft(ft_date DESC,ft_num,sq)上创建唯一索引ux_ft,其中(ver=true);,除了根据数据库中的值检查输入值。请澄清您的问题。很难猜出你在追求什么。如果找不到合适的术语来描述您的意图,请添加一个测试用例。是否要根据列“num”中的所有现有值测试新的_num?我想知道您是否真的在寻找排除约束。