SQL中如何实现CHECK约束的大小写不敏感校验?
Oracle CHECK约束支持大小写不敏感校验的方案
以下方案均不需要新增大小写相关的枚举值,可直接实现混合大小写取值插入:
- 方案1:修改CHECK约束,使用大小写转换函数统一校验(最通用,兼容所有Oracle版本)
仅在校验时将字段值统一转为大写,和已有的全大写枚举值匹配即可,操作步骤如下:- 删除原有CHECK约束:
ALTER TABLE ORDER_SOURCE DROP CONSTRAINT order_source_os_desc_cc;- 新增支持大小写不敏感校验的约束:
该方案不会修改存入数据库的原始值,用户插入的ALTER TABLE ORDER_SOURCE ADD CONSTRAINT order_source_os_desc_cc CHECK (UPPER(OS_DESC) IN ('CATALOG DESCRIPTION', 'WEB SITE'));Web Site会原样保留,仅在校验时做大小写转换匹配。 - 方案2:使用不区分大小写的列排序规则(适用于Oracle 12cR2及以上版本)
直接修改OS_DESC列的排序规则为大小写不敏感模式,原有CHECK约束无需修改即可支持混合大小写插入:
该方案后续所有针对该列的字符串比较都会默认忽略大小写,适合业务上该字段全场景都不需要区分大小写的场景。ALTER TABLE ORDER_SOURCE MODIFY OS_DESC VARCHAR2(20) COLLATE BINARY_CI; - 方案3:使用触发器自动转换大小写(备选,适合需要强制统一存储格式的场景)
如果业务允许将该字段统一以全大写格式存储,可以新增触发器在插入/更新前自动转换字段值,无需修改原有约束:
注意:该方案会修改用户输入的原始值,存入数据库的会是全大写格式,不会保留用户输入的大小写混合样式。CREATE OR REPLACE TRIGGER trg_order_source_os_desc BEFORE INSERT OR UPDATE OF OS_DESC ON ORDER_SOURCE FOR EACH ROW BEGIN :NEW.OS_DESC := UPPER(:NEW.OS_DESC); END; /
内容的提问来源于stack exchange,提问作者Muha18
相关产品推荐
相关产品推荐

