2010-03-02 170 views
0

我正在嘗試創建一個具有開始日期的字段的表,我想將檢查輸入到mkae,以確保今天之前的日期不能輸入。這是我迄今爲止對該表的代碼爲日期大於或等於當前日期創建IBM DB2 CHECK

CREATE TABLE client_service (
    NHS_num Varchar(10) NOT NULL, 
    service_id Integer NOT NULL, 
    starting_date Date NOT NULL CHECK(starting_date >= CURDATE()), 
    num_weeks Integer NOT NULL CHECK(num_weeks > 0), 
    client_contribution Decimal(10,2) NOT NULL CHECK(client_contribution >= 0), 
    CONSTRAINT PrimaryKey PRIMARY KEY (
      NHS_num, 
      service_id, 
      starting_date 
    ) 
); 

回答

1

我認爲問題是在檢查中使用CURDATE函數。我跑這個例子:
CREATE TABLE EMP
(ID SMALLINT NOT NULL,
NAME VARCHAR(9),
DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),
JOB CHAR(5) CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),
HIREDATE DATE,
SALARY DECIMAL(7,2),
COMM DECIMAL(7,2),
PRIMARY KEY (ID),
CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500))

它工作得很好。我改成了這一點:
CREATE TABLE landrews.EMP
(ID SMALLINT NOT NULL,
NAME VARCHAR(9),
DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),
JOB CHAR(5) CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),
HIREDATE DATE,
SALARY DECIMAL(7,2),
COMM DECIMAL(7,2),
PRIMARY KEY (ID),
CONSTRAINT YEARSAL CHECK (HIREDATE >= CURDATE()))

並將其與包括以下的錯誤消息被拒絕它: 所述檢驗條件使用列函數或UDF

+0

那麼我該如何獲得當前日期? – Chris 2010-03-02 20:32:10

+1

也許做一個Before Insert觸發器來檢查日期? – Leslie 2010-03-02 20:54:58

+0

會CURDATE()在觸發器中工作嗎?我不太確定這樣的觸發器的語法是什麼 – Chris 2010-03-03 12:00:32

2

documentation爲CREATE TABLE:

The search-condition cannot contain any of the following (SQLSTATE 42621): 
* Subqueries 
* XMLQUERY or XMLEXISTS expressions 
* Dereference operations or DEREF functions where the scoped reference argument is other than the object identifier (OID) column 
* CAST specifications with a SCOPE clause 
* Column functions 
* Functions that are not deterministic 
* Functions defined to have an external action 
* User-defined functions defined with either CONTAINS SQL or READS SQL DATA 
* Host variables 
* Parameter markers 
* Special registers 
* Global variables 
* References to generated columns other than the identity column 
* References to columns of type XML (except in a VALIDATED predicate) 
* An error tolerant nested-table-expression 

所以,正如Leslie所說,正確的做法是使用BEFORE INSERT觸發器。

相關問題