2016-03-19 66 views
0

我正在爲計算機商店設置數據庫。在數據庫中我有一個名爲computer_system的表,它具有一個數組屬性。在陣列這些組件去: CPU RAM 情況下 主板 顯卡如何在postgreSQL中設置條件約束

現在到了棘手的部分: 的不同組件都有自己的桌子,是一個被稱爲組件表中的所有子表。 主板表具有稱爲「板載圖形」的屬性。如果它有一個圖形卡,它將在這裏列出。如果不是,則該屬性爲空。

現在,當我在computer_system表中插入組件時,我需要postgres來檢查主板是否通過,有一個on_board圖形卡。如果沒有,則必須添加圖形卡,然後才能成功執行查詢。我如何添加這個約束?

我試圖解釋我的問題盡我所能,我已經檢查了我所有的書,但是我找不到答案。隨意問我,如果有什麼不清楚的。 此外,這裏是一個未完成的ER-圖我已經爲這個數據庫進行

http://i.stack.imgur.com/zAT0f.png

編輯: 在什麼我想要做的。換句話說,如果mainboard.on_board_graphics爲NULL,則graphics_card不能空值。

+0

組件及其特性變化如此之快,您將不得不每天重新設計您的模式。看起來JSON格式更適合這個,在應用程序方面有限制。 –

+0

@EgorRogov這是一個學校作業,所以我不需要根據組件的真實世界的特性來更新數據庫:) – yeahboy

+0

那麼,如果沒有看到表格,很難建議一些東西。但是,如果您最多隻允許將一個圖形卡連接到主板,則可以使用這樣的FK:'mainboard.graphics_card_id引用graphics_card(id)'。然後你可以添加約束'check((on_board_graphics不爲空)或(graphics_card_id不爲null))'。 –

回答

1

顯而易見的方法是執行CHECK約束,該約束不允許graphics_card和on_board_graphics同時爲null。但on_board_graphics在另一個表中,並且由於postgresql不允許在CHECK中使用子查詢,所以這不是一個解決方案。

我解決了這個通過添加功能和觸發這樣的:

CREATE FUNCTION graphics_guaranteed() RETURNS TRIGGER AS $$ 
BEGIN 

IF 
(SELECT on_board FROM mainboard WHERE NEW.mainboard = mainboard.name) IS NULL 
AND 
NEW.graphics_card IS NULL 
THEN 
RAISE EXCEPTION 'graphics not found'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER graphics_trigger 
AFTER UPDATE OR INSERT ON computer_system 
FOR EACH ROW 
EXECUTE PROCEDURE graphics_guaranteed(); 

希望這會有所幫助,如果另外一個人在同樣的問題絆倒。