首页 MsSql教程 sql – 出生日期的CHECK约束?

sql – 出生日期的CHECK约束?

我在Oracle中创建了我的员工表,并且我想在emp_date中创建它,所以出生日期不会再回到过去,也不能在将来设置?

这在CREATE TABLE语句中实现太复杂了吗?如果是这样,那么我想我必须跳过它,因为这是我必须创建约束的部分.

,emp_dob DATE NOT NULL

    CREATE TABLE employee(emp_id NUMBER(4) PRIMARY KEY,emp_name VARCHAR2(40) NOT NULL,emp_address VARCHAR2(60) NOT NULL,emp_tel NUMBER(11) NOT NULL,CONSTRAINT emp_tel_length CHECK (LENGTH(emp_tel) BETWEEN 9 and 11),emp_dob DATE NOT NULL,CONSTRAINT check_date_of_birth CHECK (emp_dob BETWEEN DATE '1950-01-01' AND sysdate))

解决方法

检查约束必须是确定性的.也就是说,特定行必须始终满足约束,否则它必须始终无法满足约束.但是,由于返回值不断变化,因此SYSDATE本质上是不确定的.因此,您无法定义调用SYSDATE或任何其他用户定义函数的CHECK约束.

如果您尝试在约束定义中引用SYSDATE,则会出现错误

SQL> ed
Wrote file afiedt.buf

  1  create table t(
  2      birth_date date check( birth_date between date '1900-01-01' and
  3                                                sysdate )
  4* )
SQL> /
                                              sysdate )
                                              *
ERROR at line 3:
ORA-02436: date or system variable wrongly specified in CHECK constraint

您可以创建一个CHECK约束,其中最小和最大日期都是硬编码的,但这不是特别实用,因为您必须不断删除并重新创建约束.

SQL> ed
Wrote file afiedt.buf

  1   create table t(
  2       birth_date date check( birth_date between date '1900-01-01' and
  3                                                 date '2011-12-08' )
  4*  )
SQL> /

Table created.

强制执行此类要求的实际方法是在表上创建触发器

CREATE OR REPLACE TRIGGER check_birth_date
  BEFORE INSERT OR UPDATE ON employee
  FOR EACH ROW
BEGIN
  IF( :new.emp_dob < date '1900-01-01' or 
      :new.emp_dob > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( 
      -20001,'EMployee date of birth must be later than Jan 1,1900 and earlier than today' );
  END IF;
END;

关于作者: dawei

【声明】:乐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

热门文章