2013-10-29 32 views
1

我有關於Oracle數據庫SQL的問題。將月份添加到EndDate作爲Oracle中的約束SQL

我的員工每個人都有一個項目,項目的結束日期取決於基於PTerm給予他們的月數。我是否有權這樣做?

CREATE TABLE PROJECT (P_ID VARCHAR (20) NOT NULL, 
        PNAME VARCHAR (100) NOT NULL, 
        PTERM VARCHAR (20), 
        PSTARTDATE DATE, 
        PENDDATE DATE, 
        CONSTRAINT PROJECT_PKEY PRIMARY KEY (P_ID), 
        CONSTRAINT PROJECT_PTERM CHECK 
         (PTERM IN ('1 MONTH', '2 MONTH', '3 MONTH')), 
        CONSTRAINT PROJECT_ENDDATE CHECK 
         (PENDDATE = (PSTARTDATE + PTERM))); 
+3

什麼味道的SQL和哪個具體的數據庫產品是這樣的?事情往往是非常快速的供應商特定....這對於MySQL來說是這樣嗎? Postgres的? SQL Server?甲骨文? IBM Db2?還有其他的東西嗎?請**相應地更新您的標籤**! –

+1

您可能會考慮從表中刪除「PENDDATE」列,並根據需要進行計算(例如,使用視圖)。 –

回答

0

如果這是Oracle然後我會走這條路

CREATE TABLE PROJECT (P_ID VARCHAR (20) NOT NULL, 
        PNAME VARCHAR (100) NOT NULL, 
        PTERM VARCHAR (20), 
        PSTARTDATE DATE, 
        PENDDATE DATE, 
        CONSTRAINT PROJECT_PKEY PRIMARY KEY (P_ID), 
        CONSTRAINT PROJECT_PTERM CHECK 
         (PTERM IN ('1', '2', '3')), 
        CONSTRAINT PROJECT_ENDDATE CHECK 
         (PENDDATE = ADD_MONTHS(PSTARTDATE , PTERM))); 

如果我嘗試下面的插入,他們會失敗,因爲它嚴格地將幾個月添加到開始日期並期望與結束相同。

INSERT INTO 
     PROJECT 
VALUES 
     (1, 
     'asb', 
     2, 
     SYSDATE, 
     SYSDATE 
     + 60); 
--ORA-02290: check constraint (PROJECT_ENDDATE) violated 

INSERT INTO 
     PROJECT 
VALUES 
     (1, 
     'asb', 
     2, 
     SYSDATE, 
     SYSDATE 
     + 62); 
--ORA-02290: check constraint (PROJECT_ENDDATE) violated 

INSERT INTO 
     PROJECT 
VALUES 
     (1, 
     'asb', 
     2, 
     SYSDATE, 
     SYSDATE 
     + 61); 
-- 1 row inserted 
+0

嗯,它是一個很好的做法腳本中的所有內容的一部分? – user2900611

+0

我爲我所有的項目制定了我自己的規則:)但是如果你有任何具有自己的規則定義的格式化工具,你可以粘貼代碼片段並進行格式化。我用我的設置在蟾蜍中按Ctrl + Shift + F – SriniV

0

OK我剛纔看到你提到甲骨文,所以我會嘗試這個

CREATE TABLE PROJECT (

P_ID   VARCHAR(20) not null, 
PName   VARCHAR(100) not null, 
PTerm   VARCHAR(20), 
PStartDate DATE, 
PEndDate  DATE, 
constraint project_Pkey primary key (P_ID), 
constraint project_pterm CHECK (PTERM IN 
         ('1 MONTH', '2 MONTH', '3 MONTH')), 
constraint project_enddate CHECK(PEndDate = (add_months(PStartDate, to_number(substr(pTerm, 1, 1))))) 

); 

我相信它會更好,如果你有這樣的表示在數(10)個月的數場,而不是VARCHAR,所以你可以使用這個領域,而不是把所有這些SUBSTR和TO_NUMBER皈依在varchar字段

+0

嗯,我可以知道爲什麼pTer,1,1? – user2900611

+0

我保持你所說的約束。如果這些值是'1個月','2個月'等,那麼我們需要整數部分。這就是爲什麼我說你應該更喜歡有一個將月份保持爲數字的字段。在這種情況下,約束將約束project_enddate CHECK(PEndDate =(add_months(PStartDate,pTerm))) – vkamayiannis

+0

好吧我現在明白了,謝謝你的幫助。 – user2900611