Jat*_*ngh 4 sql database oracle oracle-sqldeveloper
我正在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))
Run Code Online (Sandbox Code Playgroud)
检查约束必须是确定性的.也就是说,特定行必须始终满足约束,否则它必须始终无法满足约束.但SYSDATE
由于返回值不断变化,本质上是非确定性的.因此,您无法定义CHECK
调用的约束SYSDATE
或任何其他用户定义的函数.
如果您尝试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
Run Code Online (Sandbox Code Playgroud)
您可以创建一个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.
Run Code Online (Sandbox Code Playgroud)
强制执行此类要求的实际方法是在表上创建触发器
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;
Run Code Online (Sandbox Code Playgroud)