2013-03-04 29 views
0

上下文:PostgreSQL數據庫與表steps與列subtypetype(整數)Postgres的列聯

需求:列subtype值設置爲NULL,如果列type值不平等於新的「4」記錄插入。

一個很好的方法來做到這一點?約束?觸發?

感謝

+3

對手冊的一個很好的閱讀會有很長的路要走。你不能用約束來改變一個值,只能阻止某人錯誤地設置它。如果你需要它自動設置,那麼你需要一個插入/更新觸發器之前。你可以在這裏閱讀觸發器:(對於觸發器函數)http://www.postgresql.org/docs/current/static/plpgsql-trigger.html和(對於觸發器本身)http://www.postgresql.org /docs/current/static/sql-createtrigger.html – 2013-03-04 16:59:53

+2

至少,您需要對錶進行約束。您*可以*編寫觸發器,從根本上糾正應用程序代碼嘗試執行的操作,但是最好修復應用程序代碼。 (如果這很實際,在這種情況下寫一個觸發器來修正這些值並不總是實際可行的。) – 2013-03-04 17:00:14

+0

通過'CHECK'約束來強制您的需求,以避免不正確的數據被保存。然後添加一個觸發器,如果​​您無法修復應用程序以正確執行此操作,則會以此方式設置數據。 – 2013-03-05 00:03:38

回答

1

首先要做的就是添加一個約束:

CHECK (type = 4 OR subtype IS NULL) -- if type is 4, sub type may or may not be null 
            -- if type is not 4, sub type must be null 

然後,如果你需要,你可以寫一個簡單的觸發器來設置這個,但一般而言,您最好還是提高應用程序錯誤如果有必要,比使用觸發器,因爲應用程序被通知它會得到什麼不是它保存的通常是一件好事。