Oracle 中 UPPER() 函数的约束,缺少表达式
Posted
技术标签:
【中文标题】Oracle 中 UPPER() 函数的约束,缺少表达式【英文标题】:Constraints with UPPER() function in Oracle, missing expression 【发布时间】:2015-11-12 02:11:21 【问题描述】: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 中运行它时,我得到了缺少的表达式。
【问题讨论】:
HIREDATE CHECK ('HIREDATE'>='01-Jan-1950'),
- 我已经在你之前的问题中告诉过这有什么问题:***.com/a/33636737/330315 你真的阅读你得到的答案吗?你一遍又一遍地问同样的问题。
【参考方案1】:
这个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')
【讨论】:
这一切意味着什么—— '^[a-z0-9._%+-]+@[A-Za-z0-9.-]+\.edu$' 您写了“您不能在电子邮件中使用子查询”。我想你的意思可能是“你不能在检查约束中使用子查询”。 @BobJarvis 。 . .谢谢(我觉得这个错误很有趣)。 @barryrobinholt - 那是Regular Expression。正则表达式是一种用于匹配文本字符串中的模式的方法。 Regular Expression tutorial here。祝你好运。以上是关于Oracle 中 UPPER() 函数的约束,缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章
Oracle数据库操作时如何使用LOWER()UPPER()函数
Oracle数据库操作时如何使用LOWER()、UPPER()函数