如何实现仅输入大写F/M时才触发员工津贴计算触发器
问题背景
在tab_employee表上创建的BEFORE UPDATE类型触发器trgAllowance,设计逻辑是根据员工性别字段EmpGender计算专项津贴SpecialAllowance:
EmpGender为'F'时,专项津贴按薪资Salary的20%计算EmpGender为'M'时,专项津贴按薪资Salary的5%计算
现有触发器存在两个不符合预期的问题:
- 输入
'F'、'M'以外的非法字符时,触发器仍会执行更新流程 - 输入小写
'f'、'm'时,触发器同样会触发津贴计算逻辑
需要调整触发器逻辑,确保所有不符合规范的输入(非大写F/M、非法字符、小写字母等)场景下,都不执行津贴计算。
原有触发器代码
CREATE TRIGGER trgAllowance -- trigger name BEFORE UPDATE ON tab_employee FOR EACH ROW BEGIN IF new.EmpGender = 'F' THEN SET new.SpecialAllowance = (new.Salary*0.2); /* Count the amount of Salary times by specific amount */ ELSEIF new.EmpGender = 'M' THEN SET new.SpecialAllowance = (new.Salary*0.05); END IF; END
修复方案
小写字符能触发计算的核心原因是MySQL默认使用大小写不敏感的排序规则(后缀为_ci的collation),字符串比较时不会区分大小写。要实现严格匹配,只需要在判断时增加二进制比较约束,仅当EmpGender完全等于大写'F'或大写'M'时才执行津贴赋值,其余所有场景直接跳过计算逻辑即可。
修复后的完整代码:
DELIMITER // -- 临时修改语句分隔符,避免触发器内分号和默认分隔符冲突 CREATE TRIGGER trgAllowance BEFORE UPDATE ON tab_employee FOR EACH ROW BEGIN -- BINARY关键字强制按字符ASCII值做严格区分大小写的等值判断 IF BINARY NEW.EmpGender = 'F' THEN SET NEW.SpecialAllowance = NEW.Salary * 0.2; ELSEIF BINARY NEW.EmpGender = 'M' THEN SET NEW.SpecialAllowance = NEW.Salary * 0.05; END IF; -- 所有不满足上述两个严格等值条件的场景,不会进入分支执行津贴赋值 END // DELIMITER ; -- 恢复默认分隔符
逻辑验证说明
- 输入大写
'F'/'M':正常进入对应分支计算津贴 - 输入小写
'f'/'m':二进制比较判定为不匹配,不执行计算 - 输入其他任意非法字符:不满足判断条件,不执行计算
内容的提问来源于stack exchange,提问作者Halima Asrar
相关产品推荐
相关产品推荐

