删除数据库表中的外键引用

时间:2012-12-23 11:03:01

标签: database-design foreign-keys relational-database foreign-key-relationship database-table

考虑到这个问题:

  

考虑表示“大于或等于”的关系geq,   也就是说,(x,y)E geq仅在y <0时。 X

create table geq
( lb integer not null 
, ub integer not null
, primary key lb
, foreign key (ub) references geq on delete cascade )
     

如果删除元组(x,y),可能会出现以下哪种情况?

     

(a)具有z> t的元组(z,w); y被删除
   (b)具有z> t的元组(z,w); x被删除

这就是我试图解决的问题: -

由于ub(上限)是外键,因此在元组(x,y)中,y是外键。  给定,表geq本身的外键(y)引用,geq中必须有一个元组(y,y')。

现在,y&gt; = x和y'&gt; = y。因此,y'> = x。

所以不使用(z,w)我使用(y,y')。

那么,答案不应该是,删除带有w&gt; x的元组(z,w)吗?

(我正在尝试解决旧的GATE论文)

2 个答案:

答案 0 :(得分:0)

if(x,y)∈geq当且仅当x>年。称之为“大于或等于”的关系是用词不当,原因我将在下面介绍。

外键是上限(ub)是正确的,这意味着 x 是外键, y 是元组中的主键(X,Y)。外键声明中的on delete cascade选项意味着每当删除记录时,任何引用已删除记录的子记录也将被删除。

对于您的情况,如果删除元组(x,y),任何引用(x,y)的记录也将被删除。

由于外键是ub,当且仅当:z = y时,记录(z,w)是(x,y)的子句。

因此,对于(x,y)的删除导致(z,w)的级联删除,必须满足以下条件:

x≥y=z≥w (这不太对,我稍后会解释。)

因此,问题的答案是 (a)和(b)都不是真的。您的结论(不在列出的选项中)也是错误的, w 必须≤ x ,而不是 w &gt; X

实际上,由于下限是主键,因此关系(a,a)不可能具有子记录,因为这将需要违反主键。因此,上限必须严格大于记录的下限以具有任何子记录。这意味着上面的关系声明更恰当:

x≥y= z&gt; w 因为y≠w

这意味着当删除元组(x,y)时,你可以说的是,有可能级联删除元组(z,w),使 z = < em> y 或 z x

答案 1 :(得分:0)

问题是NOT NULLable外键,加上'y&lt; x'约束:它需要每行都有一个数字较小的行。

有两种方法可以为没有父节点的节点创建标记值:

  • 将link-pointer设置为NULL
  • 将其设置为与id相同的值。

代码示例:

CREATE TABLE geq_one
    ( id INTEGER NOT NULL PRIMARY KEY
    , parent_id INTEGER  NOT NULL REFERENCES geq_one(id) ON DELETE CASCADE
    , CONSTRAINT younger_than_parent_one CHECK (parent_id <= id)
    )
        ;
INSERT INTO geq_one(id,parent_id) VALUES
(1,1) -- sentinel
, (2,1)
, (3,1)
        ;

CREATE TABLE geq_two
    ( id INTEGER NOT NULL PRIMARY KEY
    , parent_id INTEGER  REFERENCES geq_two(id) ON DELETE CASCADE
    , CONSTRAINT younger_than_parent_two CHECK (parent_id < id)
    )
        ;
INSERT INTO geq_two(id,parent_id) VALUES
(1,NULL) -- sentinel
, (2,1)
, (3,1)
        ;

DELETE FROM geq_one WHERE id = 1;
SELECT * FROM geq_one;

DELETE FROM geq_two WHERE id = 1;
SELECT * FROM geq_two;