0

考慮這個問題:刪除數據庫中的表的外鍵引用

考慮的關係geq表示「大於或等於」, 即(X,Y)電子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)被刪除,下列哪一項是可能的?

(一)元組(Z,W),其中z> y被刪除
(b)一個元組(Z,W),其中z> x被刪除

這是我在嘗試解決它: -

由於ub(上限)是外鍵,在元組(x,y)中,y是外鍵。 鑑於外鍵(y)引用表geq本身,geq中必須有一個元組(y,y')。

現在,y> = x且y'> = y。因此,y'> = x。

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

所以,不應該答案是,刪除w> x的元組(z,w)?

(我試圖解決一個老閘紙)

+0

回答

0

如果(X,Y)∈geq當且僅當X> Y。將關係稱爲「大於或等於」是一種誤用,因爲我將在下面進行討論。

你是正確的外鍵的上限(ub),這意味着X是外鍵和ÿ是在元組(X,Y)的主鍵。外鍵聲明中的on delete cascade選項意味着每當刪除一條記錄時,引用該刪除記錄的任何子記錄也將被刪除。

對於您的情況,如果刪除元組(x,y),則引用(x,y)的任何記錄也將被刪除。

由於外鍵是ub,當且僅當:z = y時,記錄(z,w)是(x,y)的子項。

因此,對於(X,Y)的缺失引起的級聯刪除(Z,W)的必須滿足以下條件:

X≥Y = Z≥瓦特(這ISN」 t),我會稍後解釋。)

因此,您的問題的答案是既不是(a)也不是(b)是真的。此外,您的結論(這是不是在列出的選項)也是不正確的,瓦特必須≤X,不瓦特>X

實際上,由於下界是主鍵,關係(a,a)不可能有子記錄,因爲這需要違反主鍵。因此,上限必須嚴格大於記錄具有任何子記錄的下限。這意味着,上述關係的語句是更恰當:

X≥Y = Z> w^因爲Y≠w^

這意味着,當一個元組(X,Y)被刪除,你可以說是,它是可能的元組(Z,W)是級聯刪除使得ž = ýžX

+0

假設我們在'lb <> ub'的地方插入記錄,'(a,a)'有必要有一個子記錄嗎?由於這是一個自引用的不可爲空的鍵,因此第一個插入必須是「(a,a)」。後面的插入必須是'(b,a)'或'(b,b)'形式' –

+0

@ChrisSaxon - 也許我應該更清楚。 (a,a)不可能有單獨的**孩子記錄(a,a),因爲這會違反PK。既然問題是關於級聯刪除,級聯刪除不會刪除父記錄兩次,我不認爲(a,a)是自引用的事實對於這個問題很重要。 –

0

問題是NOT NULLable外鍵,加上'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;