SQL中为PHOTO_FILENAME字段创建不区分大小写的CHECK约束
为Oracle表的PHOTO_FILENAME字段添加不区分大小写的后缀CHECK约束
你要实现的不区分大小写检查.jpg后缀的需求,正确的CHECK约束写法是第一种的逻辑修正版(你的第一种写法本身逻辑没问题,只需保证语法完整):
CONSTRAINT P_PHOTO_CHK CHECK (UPPER(PHOTO_FILENAME) LIKE '%.JPG')
为什么这个写法可行?
UPPER(PHOTO_FILENAME)会把字段值统一转换为大写,不管原文件名是.jpg、.JPG还是.JpG这类混合大小写的后缀,转大写后都会变成.JPGLIKE '%.JPG'匹配所有以.JPG结尾的字符串,完美实现不区分大小写的后缀检查
你的两种写法分析
- 第一种写法逻辑完全正确,只要把它正确加到建表语句的约束列表中(注意用逗号分隔其他约束)即可
- 第二种写法
CHECK((PHOTO_FILENAME) LIKE %[.]jpg')存在两处错误:- Oracle的
LIKE运算符不支持[.]这种正则风格的匹配,这是SQL Server等其他数据库的语法 - 语句本身有语法错误,
%[.]jpg'缺少开头的单引号
- Oracle的
完整的CREATE TABLE语句
将正确的约束整合到建表语句后,最终代码如下:
CREATE TABLE P_PHOTO ( PHOTO_ID CHAR(5) NOT NULL, PHOTO_FILENAME VARCHAR2(60) DEFAULT 'NOIMAGE.JPG' NOT NULL, PHOTO_TIMESTAMP TIMESTAMP(2) DEFAULT SYSDATE NOT NULL, DOG_ID CHAR(5) NOT NULL, CONSTRAINT P_PHOTO_PK PRIMARY KEY (PHOTO_ID), CONSTRAINT P_PHOTO_P_DOG_FK FOREIGN KEY (DOG_ID) REFERENCES P_DOG(DOG_ID), CONSTRAINT P_PHOTO_CHK CHECK (UPPER(PHOTO_FILENAME) LIKE '%.JPG') );
进阶严谨写法(可选)
如果需要更精确地匹配最后一个.后的后缀为jpg(避免文件名中多个.导致的误判),可以使用Oracle的REGEXP_LIKE函数,写法如下:
CONSTRAINT P_PHOTO_CHK CHECK (REGEXP_LIKE(PHOTO_FILENAME, '\.jpg$', 'i'))
这里的'i'参数表示不区分大小写,\.jpg$正则表达式会精确匹配以.jpg结尾的字符串(正则中.需要用反斜杠转义),适合更复杂的匹配场景。
内容的提问来源于stack exchange,提问作者love4mj789
相关产品推荐
相关产品推荐

