postgresql - postgres 中相对于其他行的部分唯一索引

标签 postgresql indexing unique

我通常知道 PostgreSQL 中的部分唯一索引,但我需要加入一个我认为不适合部分索引领域的约束。或者也许有某种方式可以表达它。

最小的例子

CREATE TABLE table (user INT, type INT, flag BOOL, text VARCHAR (50));

要求是:

  1. 用户 可以有多个相同类型 的行,但前提是 flag 为 false。

    <
  2. 如果一个用户有一个具有特定type的行并且一个flag设置为true,那么就没有其他该用户类型的行。

例如,如果表格有以下行:

| user | type | flag  | text |
| 1    | 1    | false | foo  |
| 1    | 1    | false | bar  |

那么我们不能插入 (1, 1, true, 'whatever')


另外如果表格有:

| user | type | flag | text |
| 1    | 1    | true | foo  |

我们不能插入 (1, 1, false, 'bar') 或 (1, 1, true, 'baz')


有没有办法像 PostgreSQL 那样表达约束?

最佳答案

您需要 partial unique index 的组合和一个 exclusion constraint .不幸的是,没有可用于排除约束中的 bool 列的运算符族,因此可以使用整数列代替。 btree_gist extension是模拟整数列的要点索引所必需的。

create extension if not exists btree_gist;

表定义(标识符修改了一下):

drop table if exists my_table;
create table my_table (
    user_id integer,
    type_id integer, 
    flag integer check (flag in (0, 1)),
    text varchar (50),
    exclude using gist (user_id with =, type_id with =, flag with <>)
);

create unique index on my_table (user_id, type_id) where flag = 1;

示例性插入:

insert into my_table
values
(1, 1, 0, 'foo'),
(1, 1, 0, 'bar'),
(2, 2, 1, 'foo');

INSERT 0 3

insert into my_table
values
(1, 1, 1, 'whatever');

ERROR:  conflicting key value violates exclusion constraint "my_table_user_id_type_id_flag_excl"
DETAIL:  Key (user_id, type_id, flag)=(1, 1, 1) conflicts with existing key (user_id, type_id, flag)=(1, 1, 0).

insert into my_table
values
(2, 2, 0, 'whatever');

ERROR:  conflicting key value violates exclusion constraint "my_table_user_id_type_id_flag_excl"
DETAIL:  Key (user_id, type_id, flag)=(2, 2, 0) conflicts with existing key (user_id, type_id, flag)=(2, 2, 1).

insert into my_table
values
(2, 2, 1, 'whatever');

ERROR:  duplicate key value violates unique constraint "my_table_user_id_type_id_idx"
DETAIL:  Key (user_id, type_id)=(2, 2) already exists.

关于postgresql - postgres 中相对于其他行的部分唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56211906/

相关文章:

sql-server - SQL Server - 计算列上的索引?

r - 不区分大小写 独特 保持原样

sql - Postgresql 选择常量

sql - 在连接字段的非重叠前缀时是否可以避免嵌套循环连接?

json - 嵌入式 json 对象的唯一索引

sql - 多列约束是为每一列创建索引还是统一索引?

r - 在 R 中列出多个向量上的唯一元素

java - HashSet 包含重复条目

java - 如何使用 Java 字符串初始化多边形

ruby-on-rails - 如何检查表中的任何 ActiveRecord 中是否存在字符串?