2017-08-04 34 views
0

我正在使用Oracle SQL Developer。在具有特定條件的表列上添加與日期相關的約束

下面是下面的表格,我創建:

CREATE Screening_Plan 
(
plan_id NUMBER (4) PRIMARY KEY, 
movie_id NUMBER (4) NOT NULL, 
plan_start_date DATE NOT NULL, 
plan_end_date DATE NOT NULL, 
plan_min_start_hh24 NUMBER (2) NOT NULL, 
plan_max_start_hh24 NUMBER (2) NOT NULL, 
plan_no_of_screenings NUMBER (2) NOT NULL 
); 

對於plan_start_date列,如何添加一個約束默認:下週一?

對於plan_end_date列,如何將約束添加到默認值:next Monday + 6(days)?

對於plan_min_start_hh24列,如何添加約束以保持9(早上9點)和22(晚上10點)之間的值並將默認值設置爲9?

對於plan_max_start_hh24列,如何添加約束以保持9(上午9點)和22(下午10點)之間的值並將默認值設置爲22並設置爲大於或等於plan_min_start_hh24?

+0

有爲什麼要添加這些規則在表級約束的原因是什麼?根據我的經驗,這種邏輯在應用層編碼爲 –

+0

我實際上想要測試一下,看看約束如何在表級別工作以獲得知識。 – stranger

+1

如果INSERT語句省略了此列的值,您是否希望將DEFAULT值分配給要分配給該列的列?或者你想定義一個INTEGRITY CONSTRAINT,這是一個禁止在列中存儲不符合dfined條件的值的規則?有兩個獨立的東西 - DEFAULT和CONSTRAINT。在後一種情況下,「開始日期必須是NEXT MONDAY」這樣的約束沒有意義。 – krokodilko

回答

0

Oracle中的約束不能引用任何非確定性的東西,即其結果可能會隨時間變化的表達式。這意味着你不能使用約束來強制執行諸如「下週一」之類的事情。一般來說,無論何時評估,約束都必須是真或假。見Restrictions on Check Constraints

但是,這可以作爲該表上的觸發器來完成。

至於其他的限制,這樣的事情應該工作:

alter table Screening_Plan add constraint Screening_Plan_ck1 check (
    plan_min_start_hh24 between 9 and 22 
); 

alter table Screening_Plan modify(plan_min_start_hh24 number(2) not null default 9);