2016-02-29 22 views
0

我是oracle數據庫中的新手。我有三個表:enter image description here防止強制性列中插入數據

現在我打算根據事件類型在事件中插入數據。 但如果我有事件類型「假期」或「病假」,其中不包含任何區域。在這種情況下,數據將如何填充到事件表中。

由於事件類型「商務旅行」,地區表與它連接。

感謝,

回答

0

如果有道理不具有任何與之相關的區域就用NULL的外鍵值:

INSERT INTO Event (ID, Event_Type, User_ID, Start_Trip, End_Trip, Start_Date, End_Date) 
VALUES   (1, 'Sick Leave', 1, NULL, NULL, DATE '2016-02-29', DATE '2016-03-31'); 

在這種情況下,Start_TripEnd_Trip列應該是可空 - 如果這是一個問題,那麼您可以將這些列上的NOT NULL約束轉換爲CHECK約束。即

CHECK ((UPPER(Event_Type) IN ('SICK LEAVE', 'VACATION') 
      AND Start_Trip IS NULL 
      AND End_Trip IS NULL) 
     OR 
     (UPPER(Event_Type) NOT IN ('SICK LEAVE', 'VACATION') 
      AND Start_Trip IS NOT NULL 
      AND End_Trip IS NOT NULL) 
    ) 

這不會再彈出,如果另一個事件類型添加,應該在這種情況下,開發商將不得不修改表約束零維護的數據的問題。 (這可以通過具有事件類型的表包含的區域是否是NULL與否的詳細信息,然後使用這個作爲Event表內的外鍵來解決。)

如果是有意義的有一個區域(即用戶如果生病或請假那麼就可能有他們的家區域相關聯),然後使用適當的區域ID:

INSERT INTO Event (ID, Event_Type, User_ID, Start_Trip, End_Trip, Start_Date, End_Date) 
SELECT 1, 'Sick Leave', ID, Region_Id, Region_Id, DATE '2016-02-29', DATE '2016-03-31' 
FROM PT_USER 
WHERE ID = 1; -- The user's ID 

你應該應該由你的業務邏輯來決定哪一個選項(我們不能幫助你)。

+0

感謝您的回覆。我將區域和事件之間的關係從強制變爲可選,現在我可以使用具有可爲空值的開始和結束行程的區域表。 –