【问题标题】:prevent insertion if regular expression is not met如果不满足正则表达式,则阻止插入
【发布时间】:2020-09-19 04:31:12
【问题描述】:

我正在研究 MySQL 中的触发器语句,如果人名有特殊字符,我需要防止插入。

我想过做这样的事情:

create trigger verifydata
    before insert
    on person
    for each row
    begin
        if(not new.name RLIKE '[A-Za-z]') then
            signal sqlstate '45000' set message_text = 'Verify name';
        end if;
    end;@
    delimiter ;

但它不起作用。

正确的做法是什么,有什么建议吗?

【问题讨论】:

    标签: mysql sql sql-insert database-trigger


    【解决方案1】:

    最新版本的 MySQL 支持check 约束:

    alter table person add constraint ck_person_name
        check (name not regexp '[^A-Za-z]');
    

    然后在大多数仍在使用的版本中,您可以通过创建视图来模拟它:

    create view v_person as
         select p.*
         from person p
         where p.name not regexp '[^A-Za-z]';
    

    然后插入到视图中。如果视图逻辑过滤掉插入,则插入失败。

    【讨论】:

      【解决方案2】:

      您正在检查您的值是否仅包含非字母字符,同时您想确保它不包含任何字符。你需要把这里的逻辑颠倒过来:

      create trigger verifydata
      before insert
      on person
      for each row
      begin
          if(new.name rlike '[^A-Za-z]') then
              signal sqlstate '45000' set message_text = 'Verify name';
          end if;
      end;
      delimiter ;
      

      请注意,如果您运行的是 MySQL 8.0.16 或更高版本,则可以使用检查约束而不是触发器来执行此操作:

      alter table person add constraint check_person_name
      check (name not rlike '[^A-Za-z]');
      

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 2022-07-21
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多