Oracle中的UPPER()函数约束,缺少表达式

时间:2015-11-12 02:11:21

标签: sql oracle

CREATE TABLE EMPLOYEE (
DISTRICT_ID                CHAR(5 BYTE)               NOT NULL,
EMP_ID                     CHAR(5 BYTE)               NOT NULL,
EMP_FNAME                  CHAR(50 BYTE)              NULL,
EMP_LNAME                  CHAR(50 BYTE)              NOT NULL,
ZIPCODE                    CHAR(5 BYTE)               NULL,
HIREDATE                   DATE               DEFAULT SYSDATE       NULL,
PREVIOUS_EXPERIENCE_YEARS  NUMBER(3,1)        DEFAULT 0             NULL,
HIGHEST_EARNED_DEGREE      CHAR(11 BYTE)      DEFAULT 'Bachelors'   NULL,
DIRECT_ADMIN_ID            CHAR(5 BYTE)       DEFAULT (null)        NULL,
IS_ADMIN                   CHAR(1 BYTE)       DEFAULT 'N'           NOT   NULL,
IS_TEACHER                 CHAR(1 BYTE)       DEFAULT 'Y'           NOT NULL,
EDU_EMAIL                  VARCHAR2(20 BYTE)          NOT NULL,
CONSTRAINT                   EMPLOYEE_PK        PRIMARY KEY(EMP_ID),
CONSTRAINT                   EMPLOYEE_FK      
FOREIGN KEY(DISTRICT_ID)
REFERENCES DISTRICT(DISTRICT_ID),
CONSTRAINT                   EMPLOYEE_FK1  
FOREIGN KEY(DIRECT_ADMIN_ID)
REFERENCES ADMIN(A_EMP_ID),
CONSTRAINT                   EMPLOYEE_UK1       UNIQUE(EDU_EMAIL),
CONSTRAINT                 HIGHEST_EARNED_DEGREEVALUES CHECK
                          (HIGHEST_EARNED_DEGREE IN ('GRE','High School',
                          'Associate','Bachelor','Master','Doctorate')),
CONSTRAINT                 HIREDATE CHECK ('HIREDATE'>='01-Jan-1950'),
CONSTRAINT                 EDU_EMAIL CHECK ('Anytext'>='2'),
CONSTRAINT                 EDU_EMAIL CHECK (SELECT = UPPER(EDU)) "Uppercase"
                                    FROM EDU_EMAIL
);

我要做的是添加一个约束来检查有效电子邮件地址的外观,电子邮件只需要正确格式化。此约束需要检查以确保输入EMPLOYEE.EDU_EMAIL的所有电子邮件地址都采用[Anytext @ [ANytext] .edu格式。无论我们在哪里看到[Anytext],都必须至少有2个字符。 edu部分必须是edu,但可以是任何大写模式,如EDU或eDu等。如果电子邮件有两个字符和.edu的任何类型的大小写,则应接受该电子邮件。尝试以某种方式使用UPPER()函数来实现此约束。同样将EMPLOYEE.HIGHEST_EARNED_DEGREE限制为我输入的值,我相信这应该是正确的。并将EMPLOYEE.HIREDATE限制为1950年1月1日或之后,拒绝不可能的条目。任何帮助表示赞赏。当我尝试在Oracle中运行它时,我得到了缺失的表达。

1 个答案:

答案 0 :(得分:2)

这个check约束没有意义:

CONSTRAINT EDU_EMAIL CHECK (SELECT = UPPER(EDU)) "Uppercase" FROM EDU_EMAIL

您不能在检查约束中使用子查询。您可以使用正则表达式。像这样:

CONSTRAINT EDU_MAIL CHECK (REGEXP_LIKE(LOWER(EDU_MAIL), '^[a-z0-9._%+-]+@[A-Za-z0-9.-]+\.edu$')

至少有两个其他约束是不正确的,因为您使用了不合适的单引号。 仅对字符串和日期常量使用单引号。

CONSTRAINT HIREDATE CHECK ('HIREDATE'>='01-Jan-1950'),
CONSTRAINT EDU_EMAIL CHECK ('Anytext'>='2'),

我不知道第二个应该是什么。第一个应该是:

CONSTRAINT HIREDATE CHECK (HIREDATE >= DATE '1950-01-01')