Как подсказывает ошибка, вы не можете сделать это с проверочным ограничением. Один из вариантов - триггер. Еще одно ограничение - это ограничение внешнего ключа, но его нужно тщательно организовать.
Сначала вам нужен столбец, который указывает, является ли тип в 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)
);