2单个表中的功能依赖关系

时间:2017-12-03 02:05:34

标签: sql database postgresql functional-dependencies

我试图根据这两个功能依赖关系创建一个模式。

  
    

A - > B,C,D

         

B - > d

  

我试图创建一个包含这两个具有以下约束的FD的单个表:

  • 一对元组(B,D)可以是重复的,但遵循FD的定义(只要有两个B值相同,则D值也相同)。

现在,我已在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

编辑:

示例数据:

enter image description here

1 个答案:

答案 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时才能接受行。)

因此,如果两行具有相同的bd不同,则正在运行的INSERTUPDATE将失败。

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