单个 table 中的 2 个功能依赖项
2 Functional Dependencies in a single table
我正在尝试创建基于这 2 个功能依赖项的模式。
A -> B, C, D
B -> D
我正在尝试创建一个 table 包含这两个具有以下约束的 FD:
- 一对元组 (B, D) 可以重复但遵循 FD 的定义(只要有两个 B 值相同,则 D 值也相同)。
现在,我在 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
,则正在 运行 的 INSERT
或 UPDATE
将失败。
http://dbfiddle.uk/?rdbms=postgres_10&fiddle=5fc308eaaedef4d3d2232ec3d70f3de6
我正在尝试创建基于这 2 个功能依赖项的模式。
A -> B, C, D
B -> D
我正在尝试创建一个 table 包含这两个具有以下约束的 FD:
- 一对元组 (B, D) 可以重复但遵循 FD 的定义(只要有两个 B 值相同,则 D 值也相同)。
现在,我在 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
,则正在 运行 的 INSERT
或 UPDATE
将失败。
http://dbfiddle.uk/?rdbms=postgres_10&fiddle=5fc308eaaedef4d3d2232ec3d70f3de6