如果不满足正则表达式,则阻止插入

1tu0hz3e  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(355)

我正在研究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 ;

但它不起作用。
正确的方法是什么,有什么建议吗?

yhxst69z

yhxst69z1#

最新版本的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]';

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

6bc51xsx

6bc51xsx2#

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

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或更高版本,则可以使用check约束而不是触发器:

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

相关问题