首页 > 解决方案 > 我在 Postgres 中的这个查询有问题

问题描述

我在 Postgres 中的这个表有问题,它给了我这个错误:

错误:无法在检查约束 LINE 66 中使用子查询:检查(Artista in(选择 ID_Artista

create table DirigeF(
    Artista int references Artista(ID_Artista) on delete cascade,
    Film int references Film(ID_Contenuto) on delete cascade,
    check(Artista in(Select ID_Artista
                    from Artista
                    where tipologia='REGISTA'or'AR')),
    constraint DirigeF_PK primary key(Artista, Film)
);

我想检查 DirigeF 表中的 Artista 是否有来自另一个表的tipologia='REGISTA'。

标签: sqlpostgresql

解决方案


正如错误所暗示的,您不能使用检查约束来执行此操作。一种选择是触发器。另一个是外键约束——但这需要仔细安排。

首先,您需要一列来指示输入的类型Artista是“REGISTA”还是“AR”。那将是:

alter table artista add is_regista_ar bool generated always as 
    (tipologia in ('REGISTA', 'AR'));

然后创建唯一约束或索引:

alter table artista add unq_artista_tipologia_id
    unique (is_regista_ar, id_artista)

注意:这需要 Postgres 12+。但是在早期版本中可以做类似的事情。

然后,在您的表中添加一个布尔列,该列始终为true

create table DirigeF (
    Artista int references Artista(ID_Artista) on delete cascade,
    Film int references Film(ID_Contenuto) on delete cascade,
    is_regista_ar bool generated always as true,
    constraint fk_artista_tipo_artista foreign key (is_regista_ar, Artista) references Artista(is_regista_ar, ID_Artista),
    constraint DirigeF_PK primary key (Artista, Film)
);

推荐阅读