考虑到这个问题:
考虑表示“大于或等于”的关系
geq
, 也就是说,(x,y)E geq仅在y <0时。 Xcreate 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论文)
答案 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'约束:它需要每行都有一个数字较小的行。
有两种方法可以为没有父节点的节点创建标记值:
代码示例:
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;