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

如何创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:17:28