-1

我有一列"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
4

2 回答 2

2

如果安装btree_gist扩展,则可以创建排除约束:

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”

在线示例

于 2020-11-06T09:04:45.383 回答
0

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

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

id_a这可以防止给定的数组重叠id_b

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-11-06T09:04:39.033 回答