1

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) ) );
4

2 に答える 2

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
于 2013-10-29T15:51:42.800 に答える
0

OK、あなたが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 MONTH', '2 MONTH', '3 MONTH')),
constraint project_enddate CHECK(PEndDate = (add_months(PStartDate, to_number(substr(pTerm, 1, 1)))))

);

varchar の代わりに number(10) で月数を示すフィールドがあれば、varchar フィールドでこのすべての substr と to_number 変換を行う代わりにこのフィールドを使用できるとよいと思います

于 2013-10-29T15:48:17.300 に答える