你可以使用一個CHECK約束下列條件:
- starting_date> prenotation_date + 3
- starting_date < ENDING_DATE
- TRUNC(starting_date)= TRUNC(ENDING_DATE)
starting_date > prenotation_date + 3
將確保預訂是allo在預訂3天后結婚。
starting_date < ending_date
將確保預訂時間始終在離開時間之前。
TRUNC(starting_date) = TRUNC(ending_date)
將確保預訂在同一天完成。 這就是預訂窗口只有一天。
測試用例:
CREATE TABLE
SQL> CREATE TABLE t(
2 prenotation_date DATE NOT NULL, starting_date DATE NOT NULL, ending_date DATE NOT NULL);
Table created.
SQL>
ADD檢查約束
SQL> ALTER TABLE t ADD CONSTRAINT t_chk CHECK(
2 (starting_date > prenotation_date + 3)
3 AND (starting_date < ending_date)
4 AND (TRUNC(starting_date) = TRUNC(ending_date))
5 );
Table altered.
SQL>
INSERT:C heck starting_date > prenotation_date + 3
。下面插入應該失敗。
SQL> INSERT
2 INTO t VALUES
3 (
4 to_date('03/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
5 to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss'),
6 to_date('03/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss')
7 );
INSERT
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated
SQL>
INSERT:檢查starting_date < ENDING_DATE。下面插入應該失敗。
SQL> INSERT
2 INTO t VALUES
3 (
4 to_date('02/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
5 to_date('03/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss'),
6 to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss')
7 );
INSERT
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated
SQL>
INSERT:檢查被預約在同一天完成。下面插入應該失敗。分別記錄開始和結束時間08:00:00
和10:00:00
的時間。
SQL> INSERT
2 INTO t VALUES
3 (
4 to_date('02/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
5 to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss'),
6 to_date('04/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss')
7 );
INSERT
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated
SQL>
INSERT:所有值滿足所述的要求,下面的插入應該通過。
SQL> INSERT
2 INTO t VALUES
3 (
4 to_date('02/01/2015 00:00:00','mm/dd/yyyy hh24:mi:ss'),
5 to_date('03/02/2015 08:00:00','mm/dd/yyyy hh24:mi:ss'),
6 to_date('03/02/2015 10:00:00','mm/dd/yyyy hh24:mi:ss')
7 );
1 row created.
SQL>
檢查約束就足夠了。我爲每個檢查的條件提供了一個完整的測試用例。看到我的答案。 – 2015-03-02 11:10:23
這裏的答案是正確的,但邏輯很容易出錯。當老闆說「現在預訂房間」時會發生什麼?你打算告訴他們:「我必須更改生產數據庫上的代碼嗎?」考慮一個單獨的表格,其中「這些將永遠不會改變」數字作爲值。然後在觸發器中引用它們而不是硬編碼值。 – kevinsky 2015-03-02 14:09:31