如何从 PostgreSQL 中的 2 列中获取唯一值
Posted
技术标签:
【中文标题】如何从 PostgreSQL 中的 2 列中获取唯一值【英文标题】:How to get unique values from 2 columns in PostgreSQL 【发布时间】: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_a3,4,5 id_b 18 --> because i have already the value of b with the same values of a
NO ERROR:
id_a3,4,5 id_b 19
ANOTHER ERROR:
id_a3 id_b 19
NO ERROR:
id_a6 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 版本,抱歉标记错误 【参考方案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
【讨论】:
以上是关于如何从 PostgreSQL 中的 2 列中获取唯一值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 postgresql 9.4 中的数组列中选择前几位
SQL查询从postgresql数据库表中具有数组数据类型的列中获取数据。