0

鉴于这个问题:

考虑一个geq表示“大于或等于”的关系,即 (x,y)E geq 仅当 y < 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 > y
的元组 (z,w) (b) 删除 z > x 的元组 (z,w)

这就是我试图解决它的方法:-

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

现在,y >= x 并且 y' >= y。因此,y' >= x。

因此,我没有使用 (z,w),而是使用了 (y,y')。

那么,答案不应该是,a tuple (z,w) with w>x is deleted 吗?

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

4

2 回答 2

0

如果 (x,y) ∈geq当且仅当 x > y。将关系称为“大于或等于”是用词不当,原因我将在下面讨论。

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

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

因为外键是ub,所以记录 (z,w) 是 (x,y) 的子当且仅当:z = y。

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

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

因此,您的问题的答案是(a)和(b)都不是真的此外,您的结论(不在列出的选项中)也是不正确的,w必须是 ≤ x,而不是w > x

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

x ≥ y = z > w因为 y ≠ w

这意味着当删除元组 (x,y) 时,您只能说元组 (z,w) 可能被级联删除,使得z = yzx

于 2012-12-23T15:30:27.940 回答
0

问题是不可为空的外键,再加上 'y < x' 约束:它需要每一行都有一个数字较小的 id 行。

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

  • 将链接指针设置为 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;
于 2012-12-23T16:03:07.080 回答