sql - 我在 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'。
解决方案
正如错误所暗示的,您不能使用检查约束来执行此操作。一种选择是触发器。另一个是外键约束——但这需要仔细安排。
首先,您需要一列来指示输入的类型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)
);
推荐阅读
- c# - 如何在 DbContext 中并行运行 Xunit 而不会发生冲突 - 主键?
- shell - 连接到 Ignite 的 Shell 脚本
- python - 为什么 venv 在 rsync 之后会中断?
- javascript - Firestore:订阅文档字段
- javascript - Leaflet 和 MarkerCluster - 当前打开弹出窗口时不执行聚类?
- java - 解析“org.apache.maven.plugins:maven-eclipse-plugin”的版本时出错:插件需要 Maven 版本 2.2.1
- python - sklearn - 如何使用管道重新加载模型并进行预测?
- postgresql - 在密码查询中间将结果导出到 csv
- batch-file - 如何遍历目录以使用批处理文件中的参数执行批处理和 exe 文件
- c - 反转名称 - 在名字字母后打印垃圾