postgresql—如何约束sql中的两列,使其中一列中的值只能与另一列中的值一起出现?

af7jpaap  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(375)

表中有两列:
-对于一行,所有两列都需要填充。
-在col1中,任何id都是允许的。
-在col2中,一个特定的id once set只允许在第一次设置时与col1中的id一起出现在更多的行中。
例子:

col1 | col2
------|------
   1  |  1        OK
   1  |  1        OK
   1  |  2        OK
   2  |  3        OK
   2  |  1        NOK because 1 in col2 is already associated with 1 in col1.
   1  |  3        NOK because 3 in col2 is already associated with 2 in col1.

我想将此规则应用于使用约束的表(无需使用第二张table)
有人能帮我吗?谢谢!

gstyhher

gstyhher1#

由于希望每个col2值只允许一个col1值,因此需要一个col2表:

create table tcol2
(
  col2 int,
  col1 int,
  primary key (col2)
);

然后,您可以只向该表中添加一个count列(这样您就可以使用col1、col2和counter,而不是每个col1和col2有多行),或者使用具有约束的现有表:

alter table mytable add constraint
  fk_mytable_tcol2 foreign key (col1, col2) references tcol2 (col1, col2);
n1bvdmb6

n1bvdmb62#

可以使用排除约束来执行此操作。您可能希望排除col2为=但col1为<>的情况。

create extension btree_gist;

create table foobar (col1 int not null, col2 int not null);

alter table foobar add constraint foobar_ex exclude using gist
   (col2 with =, col1 with <>);
5anewei6

5anewei63#

我认为你应该修正你的数据模型。你应该有一张每张一行的table col2 值和关联的 col1 价值:

create table col2_col1_lookup as (
     col2 int primary key,
     col1 int unique
);

您可以查找 col1 此表中的值。

相关问题