如何创建PL/SQL触发器校验CREW_NUMBER的1字母2数字格式?
校验CREWS表CREW_NUMBER格式的触发器实现
核心思路是利用正则表达式直接匹配「1个字母+2个数字」的格式,无需逐字符拆分校验。以下是主流数据库的具体实现:
MySQL 版本
创建两个触发器分别处理插入和更新操作,使用REGEXP关键字匹配正则规则:
DELIMITER // -- 插入时校验 CREATE TRIGGER validate_crew_number_insert BEFORE INSERT ON CREWS FOR EACH ROW BEGIN IF NEW.CREW_NUMBER NOT REGEXP '^[A-Za-z][0-9]{2}$' THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'CREW_NUMBER格式错误,必须为1个字母+2个数字(例:A07)'; END IF; END // -- 更新时校验 CREATE TRIGGER validate_crew_number_update BEFORE UPDATE ON CREWS FOR EACH ROW BEGIN IF NEW.CREW_NUMBER NOT REGEXP '^[A-Za-z][0-9]{2}$' THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'CREW_NUMBER格式错误,必须为1个字母+2个数字(例:A07)'; END IF; END // DELIMITER ;
Oracle 版本
可合并插入和更新的触发时机,使用REGEXP_LIKE函数做正则匹配:
CREATE OR REPLACE TRIGGER validate_crew_number BEFORE INSERT OR UPDATE OF CREW_NUMBER ON CREWS FOR EACH ROW BEGIN IF NOT REGEXP_LIKE(:NEW.CREW_NUMBER, '^[A-Za-z][0-9]{2}$') THEN RAISE_APPLICATION_ERROR(-20001, 'CREW_NUMBER格式错误,必须为1个字母+2个数字(例:A07)'); END IF; END; /
SQL Server 版本
SQL Server 2016及以上支持REGEXP_LIKE,这里以INSTEAD OF触发器为例实现校验:
CREATE TRIGGER validate_crew_number ON CREWS INSTEAD OF INSERT, UPDATE AS BEGIN SET NOCOUNT ON; -- 校验格式是否合法 IF EXISTS ( SELECT 1 FROM inserted WHERE NOT REGEXP_LIKE(CREW_NUMBER, '^[A-Za-z][0-9]{2}$') ) BEGIN RAISERROR('CREW_NUMBER格式错误,必须为1个字母+2个数字(例:A07)', 16, 1); ROLLBACK TRANSACTION; RETURN; END; -- 执行合法的插入/更新操作 INSERT INTO CREWS (CREW_NUMBER) SELECT CREW_NUMBER FROM inserted; END;
正则规则说明
^[A-Za-z][0-9]{2}$ 的含义:
^:匹配字符串开头,确保没有前置字符[A-Za-z]:匹配任意大小写英文字母[0-9]{2}:匹配恰好2个数字$:匹配字符串结尾,确保没有后置多余字符
内容的提问来源于stack exchange,提问作者A-n
相关产品推荐
相关产品推荐

