我试图根据这两个功能依赖关系创建一个模式。
A - > B,C,D
B - > d
我试图创建一个包含这两个具有以下约束的FD的单个表:
现在,我已在2个表中实现了如下:
CREATE TABLE one(
B INT PRIMARY KEY,
D INT NOT NULL,
UNIQUE (B, D)
);
CREATE TABLE two(
A INT PRIMARY KEY,
B INT NOT NULL,
C INT NOT NULL,
D INT NOT NULL,
FOREIGN KEY(B, D) REFERENCES one(B, D)
);
我只是想知道是否有一种方法可以在一个表中将这两个表合并而不在Postgresql中使用 TRIGGERS ?
编辑:
示例数据:
答案 0 :(得分:1)
我必须自己学习,但我认为这就是你想要的......
CREATE EXTENSION btree_gist;
CREATE TABLE fd (
a INT PRIMARY KEY,
b INT NOT NULL,
c INT NOT NULL,
d INT NOT NULL,
EXCLUDE USING gist (b WITH =, d WITH <>)
);
排除约束会相互检查所有行,就像UNIQUE
约束检查所有行相互对齐一样。但它更加普遍。
如果所有检查(b WITH =, d WITH <>)
均为TRUE
,则该行将被拒绝。
(相反,这意味着只有在至少一次检查为FALSE
时才能接受行。)
因此,如果两行具有相同的b
但d
不同,则正在运行的INSERT
或UPDATE
将失败。
http://dbfiddle.uk/?rdbms=postgres_10&fiddle=5fc308eaaedef4d3d2232ec3d70f3de6