单个 table 中的 2 个功能依赖项

2 Functional Dependencies in a single table

我正在尝试创建基于这 2 个功能依赖项的模式。

A -> B, C, D

B -> D

我正在尝试创建一个 table 包含这两个具有以下约束的 FD:

现在,我在 2 table 秒内实现了如下:

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)
);

我只是想知道是否有一种方法可以将这 2 个 table 组合成一个 table 而无需在 Postgresql 中使用 TRIGGERS

编辑:

示例数据:

我不得不自己学习,但我认为这就是你想要的...

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,则正在 运行 的 INSERTUPDATE 将失败。

http://dbfiddle.uk/?rdbms=postgres_10&fiddle=5fc308eaaedef4d3d2232ec3d70f3de6