2017-12-03 202 views
2

我正在尝试基于这两个函数依赖关系创建一个模式。2单个表中的函数依赖关系

A - > B,C,d

乙 - > d

我试图建立一个单一的表既包括这些的FD与以下约束的:

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

    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桌,而无需使用TRIGGERS:现在

,我在2个表如下实施本在Postgresql中?

编辑:

示例数据:

enter image description here

+2

你说的'在短短一个table'结合这两个表是什么意思?你能举出你想要的例子吗,最好包括例子数据? *(我相信我理解你描述的约束条件,我只是不明白最后一点...)* – MatBailie

+0

@MatBailie我的意思是,不是创建2个单独的表,我只是想创建一个包含所有这些属性的表。我用一个例子编辑了这篇文章。 –

+0

好吧,我想你的意思是'我只是想创建一个包含所有这些属性的表格,并且强制执行所有这些约束而不需要第二个表格...... – MatBailie

回答

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但不同dINSERTUPDATE正被运行将失败。

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

+0

这就是我正在寻找的。可以肯定的是,在Postgresql中只使用外键/唯一约束或检查约束是不可能的? –

+1

@jeeva_v如果你只想要一张桌子,那就不行了......你已经展示了如何用外键来做......唯一的选择是触发器等,它们都有竞争条件问题。 – MatBailie

+1

另外,请注意'EXCLUDE' ***实际上是一种'CHECK'约束。只是一个非常灵活的。 – MatBailie