You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这类混合大小写的后缀,转大写后都会变成.JPG
  • LIKE '%.JPG'匹配所有以.JPG结尾的字符串,完美实现不区分大小写的后缀检查

你的两种写法分析

  1. 第一种写法逻辑完全正确,只要把它正确加到建表语句的约束列表中(注意用逗号分隔其他约束)即可
  2. 第二种写法CHECK((PHOTO_FILENAME) LIKE %[.]jpg')存在两处错误:
    • Oracle的LIKE运算符不支持[.]这种正则风格的匹配,这是SQL Server等其他数据库的语法
    • 语句本身有语法错误,%[.]jpg'缺少开头的单引号

完整的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:35:23