CHECK constraint on date of birth?

前端 未结 5 866
南方客
南方客 2020-12-07 02:49

I am creating my employee table in Oracle and for emp_date I would like to make it so the date of birth is not way back in the past and can not be set in the future?

5条回答
  •  时光说笑
    2020-12-07 03:46

    Check constraints must be deterministic. That is, a particular row must always satisfy the constraint or it must always fail to satisfy the constraint. But SYSDATE is inherently non-deterministic since the returned value is constantly changing. Thus, you cannot define a CHECK constraint that calls SYSDATE or any other user-defined function.

    If you try to reference SYSDATE in the constraint definition, you'll get an error

    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
    

    You could create a CHECK constraint where both the minimum and maximum date were hard-coded but that would not be particularly practical since you'd have to constantly drop and recreate the constraint.

    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.
    

    The practical way to enforce this sort of requirement would be to create a trigger on the table

    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;
    

提交回复
热议问题