我正在 PostgreSQL 中创建一个 IDs 表来表示多个外部 ID 之间的关系 - 称它们为a
,b
和c
.
我碰巧知道外国ID之间有一对多的关系:
a 1..* b
b 1..* c
a
我想将它们表示为一个表(见下文),但在& b
、 & 和 之间b
强制执行一对多不变量c
。
那可能吗?
示例:以下插入是非法的:
PK | 一个 | b | C | 原因 |
---|---|---|---|---|
p15 | a1 | b11 | c111 | c111 已经存在 |
p16 | a1 | b21 | c213 | a2 的 b21 已存在 |
p17 | a2 | b11 | c214 | a1 的 b11 已存在 |
给定以下合法表格:
PK | 一个 | b | C |
---|---|---|---|
p1 | a1 | b11 | c111 |
p2 | a1 | b11 | c112 |
p3 | a1 | b12 | c121 |
p4 | a1 | b12 | c122 |
p5 | a2 | b21 | c211 |
p6 | a2 | b21 | c212 |
p7 | a2 | b22 | c221 |
p8 | a2 | b22 | c222 |
p9 | 无效的 | b31 | c311 |
p10 | a3 | 无效的 | c312 |
p11 | a3 | b31 | 无效的 |
p12 | 无效的 | 无效的 | c314 |
p13 | 无效的 | b31 | 无效的 |
p14 | a3 | 无效的 | 无效的 |
这必须由 完成,因为它对于约束
TRIGGER
来说太复杂了CHEKC
对于更新,您需要类似的触发器/功能
上下文: PL/pgSQL 函数 check_insert() 第 4 行,位于 RAISE
上下文: PL/pgSQL 函数 check_insert() 第 6 行,位于 RAISE
上下文: PL/pgSQL 函数 check_insert() 第 6 行,位于 RAISE
db<>在这里摆弄