【问题标题】:How to get unique values from 2 columns in PostgreSQL如何从 PostgreSQL 中的 2 列中获取唯一值
【发布时间】:2020-11-06 08:55:18
【问题描述】:

我有一列 "id_a" 和一列 "id_b"

"id_a" 是整数[] 类型。

"id_b" 是 int 类型。

我得想办法验证没有更多的id_a具有相同id_b的值

For Example:
id_a {3,4,5}    id_b 18

其他示例:

ERROR:
id_a{3,4,5}  id_b 18 --> because i have already the value of b with the same values of a 

NO ERROR:
id_a{3,4,5}  id_b 19

ANOTHER ERROR:
id_a{3}      id_b 19

NO ERROR:
id_a{6}      id_b 18

【问题讨论】:

  • @a_horse_with_no_name 我想创建一个约束,我曾考虑过使用 UNIQUE 但我不知道如何在不同类型上使用它。
  • @LaurenzAlbe 所以我应该将列“Id_a”的类型从 Integer [] 更改为 int?例如有这样的价值观?第 1 行:名称:abc id_a 3 id_b 18 第 2 行:名称:cba id_a 4 id_b 18
  • @a_horse_with_no_name 我目前使用的是 12.4 版本,抱歉标记错误

标签: sql postgresql create-table exclusion-constraint


【解决方案1】:

如果你安装了btree_gist扩展,你可以创建一个exclusion constraint

create table data (id_a int[], id_b int);

alter table data
  add constraint check_ids 
  exclude using gist (id_a with &&, id_b with =);

初始行 - 没问题

insert into data (id_a, id_b) values ('{3,4,5}', 18);

再次运行上述代码会产生预期的错误。

以下作品:

insert into data (id_a, id_b) values ('{3,4,5}', 19);

然后:

insert into data (id_a, id_b) values ('{3}', 19);

会导致错误

错误:冲突的键值违反了排除约束“check_ids”

Online example

【讨论】:

  • 哦,哇。我不知道你可以在数组上有一个 GiST 索引。
  • @LaurenzAlbe:仅当您安装 btree_gist 扩展时
【解决方案2】:

您可以使用排除约束,如下所示:

create table mytable (
    id_a int[],
    id_b int,
    exclude using gist(id_a with &&, id_b with =)
);

对于给定的id_b,这可以防止id_a 上的数组重叠。

Demo on DB Fiddle

insert into mytable values ('{3,4,5}', 18);
-- 1 rows affected

insert into mytable values ('{3,4,5}', 18);
-- ERROR:  conflicting key value violates exclusion constraint "mytable_id_a_id_b_excl"
-- DETAIL:  Key (id_a, id_b)=({3,4,5}, 18) conflicts with existing key (id_a, id_b)=({3,4,5}, 18).

insert into mytable values ('{3,4,5}', 19);
-- 1 rows affected

insert into mytable values ('{3}', 19);
-- ERROR:  conflicting key value violates exclusion constraint "mytable_id_a_id_b_excl"
-- DETAIL:  Key (id_a, id_b)=({3}, 19) conflicts with existing key (id_a, id_b)=({3,4,5}, 19).

insert into mytable values ('{6}', 18);
-- 1 rows affected

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 2012-01-12
    • 2014-01-11
    • 2021-03-14
    • 2011-03-31
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多