2013-10-26 57 views
3

Simple Database Design外鍵是否在主表更新時自動更新?

以上是我簡單的數據庫設計,只是想獲得有關事情發生的信息,因爲我真的是數據庫的新手。以下是我的問題:

  1. ,因爲我更新牆表wall_id,並在wall_categories表wall_id也得到更新?作爲wall_id在 中wall_categories表的引用wall_id在牆表中。

  2. 同在牆上的表,因爲它是一個外鍵引用在desktop_wall表桌面ID桌面ID,所以當我更新牆表 桌面ID並在deskotp_wall也 的桌面ID被更新?

  3. 如果它默認沒有更新,怎麼辦?

非常感謝!

+0

那麼,這將是最好的,如果在第一時間沒有更新的主鍵。 .. –

+0

@marc_s,請你詳細說明一下嗎?爲什麼不呢?另一種選擇是什麼?謝謝! –

回答

2

沒有外鍵沒有自動更新。您需要更新自己引用的表中的外鍵,否則會導致參照完整性異常。

對於自動更新外鍵,您可以使用TRIGGERS

編輯: -

正如意見建議的sqlvogel如果你的DBMS支持級聯更新你不需要創建觸發。

在這種情況下,這將是,如果你有Cascading Referential Integrity Constraints

更好地使用級聯引用完整性約束,可以定義 行動的SQL服務器,當用戶試圖刪除或採取 更新的關鍵現有的外鍵指向哪一個。

+0

是那些ON UPATE,ON DELETE觸發器?哦,我認爲這些都是制約因素。 –

+1

您可以在列上創建觸發器以便自動更新外鍵。所以無論何時列將被更改,外鍵都會自動更新! –

+1

如果您的DBMS支持級聯更新,請不要使用觸發器。 – sqlvogel

0

不會自動更新。數據庫是什麼?你什麼?

+0

上午我打算使用wall_id主鍵,就像一個主鍵主哈哈..所以當我添加一個牆壁牆表,其他表與wall_id也得到更新,如果需要..例如我添加壁紙所以細節得到更新,在同一個腳本中我爲壁紙定義了一個類別,因爲這是一個不同的表,我想要的是從wall表中自動獲取wall_id並添加類別。更具體的例子:walls表( wall_id = 1,wall_name = wallOne,desktop_id = 1)我想要的是類別表(wall_id = 1,category_id =也許2)<-this必須conft bt你會明白。 –

2
  1. 正如我更新牆表wall_id,並在wall_categories表wall_id也得到更新?因爲wall_categories表中的wall_id引用了wall表中的wall_id。

  2. 與desktop_id在walls表中相同,因爲它是desktop_wall表中desktop_id的外鍵引用,所以當我更新desktop_id在牆表中時desktop_id在deskotp_wall中也得到更新嗎?

沒有,更新將不會自動發生。事實上,你會得到一個SQLException,因爲你試圖打破參照完整性,因此你的更新將失敗。假設您有適用於表的Constraints


還有一個 ON UPDATE CASCADE,但它的 而不是支持所有數據庫。而級聯更新顯然應該是首選;如果你的數據庫不支持它,你需要實現一個 行後 Trigger

例如,在Oracle你會實現這個爲:

CREATE OR REPLACE TRIGGER walls_wall_upd_trg 
AFTER UPDATE OF wall_id ON walls FOR EACH ROW 
BEGIN 
    UPDATE wall_categories 
     SET wall_id = :new.wall_id 
    WHERE wall_id = :old.wall_id; 

    UPDATE wall_comments 
     SET wall_id = :new.wall_id 
    WHERE wall_id = :old.wall_id; 
END; 

CREATE OR REPLACE TRIGGER walls_desk_upd_trg 
AFTER UPDATE OF desktop_id ON walls FOR EACH ROW 
BEGIN 
    UPDATE desktop_wall 
     SET desktop_id = :new.desktop_id 
    WHERE desktop_id = :old.desktop_id; 
END; 
+0

我不確定這是否屬實。 ON DELETE CASCADE應僅在DELETE命令上執行,如果更改了ID,可能有例外,但記錄無法刪除。 – baltov

+0

還有一個'ON UPDATE CASCADE',但它不支持所有數據庫。你的目標數據庫是什麼? –

+0

@baltov你說得對。看來大多數數據庫在更新上失敗。感謝您指出了這一點。 –

2

在PostgreSQL我寫這樣

ALTER TABLE a_table 
ADD CONSTRAINT fk_a_b FOREIGN KEY (a_id) 
REFERENCES b_table (b_some_id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

和獲取的Fileds被更新,並與級聯方式刪除。