10

假设我有一个名为电话号码的属性,并且我想对该字段的条目强制执行某些有效性。我可以为此目的使用正则表达式吗,因为正则表达式在定义约束方面非常灵活。

4

3 回答 3

18

是的你可以。MySQL 支持正则表达式 ( http://dev.mysql.com/doc/refman/5.6/en/regexp.html ),对于数据验证,您应该使用触发器,因为 MySQL 不支持 CHECK 约束(您可以随时移至 PostgreSQL作为备选:)。注意!请注意,即使 MySQL 确实具有 CHECK 约束构造,不幸的是 MySQL(到目前为止 5.6)并未根据检查约束验证数据。根据http://dev.mysql.com/doc/refman/5.6/en/create-table.html:“CHECK 子句被解析,但被所有存储引擎忽略。”

您可以为列phone添加检查约束:

CREATE TABLE data (
  phone varchar(100)
);

DELIMITER $$
CREATE TRIGGER trig_phone_check BEFORE INSERT ON data
FOR EACH ROW 
BEGIN 
IF (NEW.phone REGEXP '^(\\+?[0-9]{1,4}-)?[0-9]{3,10}$' ) = 0 THEN 
  SIGNAL SQLSTATE '12345'
     SET MESSAGE_TEXT = 'Wroooong!!!';
END IF; 
END$$
DELIMITER ;


INSERT INTO data VALUES ('+64-221221442'); -- should be OK
INSERT INTO data VALUES ('+64-22122 WRONG 1442'); -- will fail with the error: #1644 - Wroooong!!! 

但是,您不应仅依靠 MySQL(在您的情况下为数据层)进行数据验证。应在应用程序的所有级别上验证数据。

于 2013-04-15T03:07:08.443 回答
4

MySQL 8.0.16 (2019-04-25) 和 MariaDB 10.2.1 (2016-04-18) 现在不仅解析 CHECK 约束,还强制执行它。

MySQL:https ://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html

MariaDB:https ://mariadb.com/kb/en/constraint/

于 2021-02-08T16:59:42.470 回答
1

实际上,我们可以在 MySQL 的检查约束中设置正则表达式。例如。,:

create table fk 
  ( 
    empid int not null unique, 
    age int check(age between 18 and 60), 
    email varchar(20) default 'N/A', 
    secondary_email varchar(20) check(secondary_email RLIKE'^[a-zA-Z]@[a-zA-Z0-9]\.[a-z,A-Z]{2,4}'), 
    deptid int check(deptid in(10,20,30)) 
  ) 
; 

此 INSERT 查询将起作用:插入 fk 值(1,19,'a@a.com','a@b.com', 30);

此 INSERT 查询将不起作用:插入 fk values(2,19,'a@a.com','a@bc.com', 30);

于 2021-06-27T02:42:18.193 回答