简体   繁体   中英

I have a problem with this query in Postgres

I have a problem with this table in Postgres, it give me this error:

ERROR: cannot use subquery in check constraint LINE 66: check(Artista in(Select 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)
);

I want to check that Artista in table DirigeF has tipologia='REGISTA' from another table.

As the error suggests, you cannot do this with a check constraint. One option is a trigger. Another is a foreign key constraint -- but that needs to be carefully arranged.

First you need a column that indicates whether the type in Artista is "REGISTA" or "AR". That would be:

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

Then create a unique constraint or index:

alter table artista add unq_artista_tipologia_id
    unique (is_regista_ar, id_artista)

Note: This requires Postgres 12+. But something similar can be done in earlier versions.

Then, add a boolean column to your table that is always 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)
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM