У меня проблема с этим запросом в Postgres - PullRequest
0 голосов
/ 17 июня 2020

У меня проблема с этой таблицей в Postgres, это дает мне эту ошибку:

ОШИБКА: невозможно использовать подзапрос в проверочном ограничении СТРОКА 66: проверка (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)
);

Я хочу проверить, что Artista в таблице DirigeF имеет типологию = 'REGISTA' из другой таблицы.

1 Ответ

1 голос
/ 17 июня 2020

Как подсказывает ошибка, вы не можете сделать это с проверочным ограничением. Один из вариантов - триггер. Еще одно ограничение - это ограничение внешнего ключа, но его нужно тщательно организовать.

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