【发布时间】:2020-02-20 17:12:19
【问题描述】:
所以我正在尝试编写完整性检查。
Foos 有 Tops 和 Alpha x 或 Beta。
Top、Alpha 和 Beta 都引用 Gamma 以及 Alpha 或 Beta 和 Foo 必须引用相同的 Gamma 作为其 Top。
即
foo1 --> top1 --> gamma1
foo1 --> alpha1 --> gamma1
允许,
foo1 --> top1 --> gamma1
foo1 --> alpha1 --> gamma2
禁止
我一直在努力
DO $check$
DECLARE
violation_type TEXT;
BEGIN
IF EXISTS(
SELECT CASE WHEN alpha.id IS NOT NULL THEN 'alpha' ELSE 'beta' END INTO violation_type
FROM
Foo o
LEFT JOIN top t ON o.top_id = t.id
LEFT JOIN alpha a ON o.alpha_id = a.id
LEFT JOIN beta b ON o.beta_id = b.id
WHERE
t.gamma_id <> coalesce(a.gamma_id, b.gamma_id)
)THEN
RAISE EXCEPTION 'Foo Violation: There are %-type foos whose top references a different gamma', violation_type;
END IF;
END $check$;
但这失败了,因为
错误:此处不允许 SELECT ... INTO
这很遗憾,因为我非常希望不必复制此代码,只需检查一次 Alpha 和一次 Beta。
这里有没有可以使用的替代方案,还是我被两个检查卡住了?
【问题讨论】:
-
。 .样本数据比抽象更有帮助。
-
在 foo 中存储
gamma并使用复合外键关系。 -
@GordonLinoff 没有复合外键。我们刚刚花了几周时间来解开一个数据库模型 s.t.我们可以摆脱这个。
-
你不需要
Select INTO::EXISTS(...)会产生一个布尔值,它可以是IF()(如果允许 if)或WHERE(...)(如果不允许)内的条件)
标签: sql postgresql stored-procedures plpgsql postgresql-9.6