sql – 出生日期的CHECK束缚?
发布时间:2021-05-17 08:22:29 所属栏目:编程 来源:网络整理
导读:我在Oracle中建设了我的员工表,而且我想在emp_date中建设它,以是出生日期不会再回到已往,也不能在未来配置? 这在CREATE TABLE语句中实现太伟大了吗?假如是这样,那么我想我必需跳过它,由于这是我必需建设束缚的部门. ,emp_dob DATE NOT NULL CREATE TABLE em
我在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; (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |