2010-03-02 90 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触发器。

相关问题