以上是我簡單的數據庫設計,只是想獲得有關事情發生的信息,因爲我真的是數據庫的新手。以下是我的問題:
,因爲我更新牆表wall_id,並在wall_categories表wall_id也得到更新?作爲wall_id在 中wall_categories表的引用wall_id在牆表中。
同在牆上的表,因爲它是一個外鍵引用在desktop_wall表桌面ID桌面ID,所以當我更新牆表 桌面ID並在deskotp_wall也 的桌面ID被更新?
如果它默認沒有更新,怎麼辦?
非常感謝!
以上是我簡單的數據庫設計,只是想獲得有關事情發生的信息,因爲我真的是數據庫的新手。以下是我的問題:
,因爲我更新牆表wall_id,並在wall_categories表wall_id也得到更新?作爲wall_id在 中wall_categories表的引用wall_id在牆表中。
同在牆上的表,因爲它是一個外鍵引用在desktop_wall表桌面ID桌面ID,所以當我更新牆表 桌面ID並在deskotp_wall也 的桌面ID被更新?
如果它默認沒有更新,怎麼辦?
非常感謝!
沒有外鍵沒有自動更新。您需要更新自己引用的表中的外鍵,否則會導致參照完整性異常。
對於自動更新外鍵,您可以使用TRIGGERS。
編輯: -
正如意見建議的sqlvogel如果你的DBMS支持級聯更新你不需要創建觸發。
在這種情況下,這將是,如果你有Cascading Referential Integrity Constraints
更好地使用級聯引用完整性約束,可以定義 行動的SQL服務器,當用戶試圖刪除或採取 更新的關鍵現有的外鍵指向哪一個。
是那些ON UPATE,ON DELETE觸發器?哦,我認爲這些都是制約因素。 –
您可以在列上創建觸發器以便自動更新外鍵。所以無論何時列將被更改,外鍵都會自動更新! –
如果您的DBMS支持級聯更新,請不要使用觸發器。 – sqlvogel
不會自動更新。數據庫是什麼?你什麼?
上午我打算使用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你會明白。 –
正如我更新牆表wall_id,並在wall_categories表wall_id也得到更新?因爲wall_categories表中的wall_id引用了wall表中的wall_id。
與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;
我不確定這是否屬實。 ON DELETE CASCADE應僅在DELETE命令上執行,如果更改了ID,可能有例外,但記錄無法刪除。 – baltov
還有一個'ON UPDATE CASCADE',但它不支持所有數據庫。你的目標數據庫是什麼? –
@baltov你說得對。看來大多數數據庫在更新上失敗。感謝您指出了這一點。 –
在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被更新,並與級聯方式刪除。
此功能稱爲級聯參照完整性。當你定義一個外鍵約束時它是可選的。語法,使其能夠在這裏描述(SQL的Micorosoft但語法標準,大多數DBMS支持它):
http://technet.microsoft.com/en-us/library/ms186973(v=sql.105).aspx
那麼,這將是最好的,如果在第一時間沒有更新的主鍵。 .. –
@marc_s,請你詳細說明一下嗎?爲什麼不呢?另一種選擇是什麼?謝謝! –