在检查约束中使用 rexexp Mysql

Use rexexp in check constraint Mysql

我想在名为 codeaccomodatie table 的主键上添加检查约束。此代码必须以 4 个字母开头并以 4 个数字 (Abcd0123) 结尾。我想我可以在如下检查约束中使用正则表达式:

alter table accomodatie add constraint check (
accomodatie.code regexp '/^[A-Z][a-z]{3}\d{4}$/' 
);

但是当我想执行上面的语句时出现错误:

Error Code: 3819. Check constraint 'accomodatie_chk_1' is violated.

我也尝试过使用 like 而不是 regexp,但这并不能解决问题。

好的,我进一步测试了一些问题。

不要使用 /<regexp>/。使用斜杠是从 PHP 或 Perl 借来的,但 MySQL 不使用它。去掉斜杠。

不支持 \d 序列。这也是从 PHP 或其他语言借来的。使用 [[:digit:]] 作为匹配数字的序列。还是好老[0-9].

mysql> select 'Abcd0123' regexp '^[A-Z][a-z]{3}[[:digit:]]{4}$' as regexp_match;
+--------------+
| regexp_match |
+--------------+
|            1 |
+--------------+

另外请记住,您会话中的默认排序规则可能不区分大小写,因此 [A-Z][a-z] 之间没有区别。

mysql> select 'abcd0123' regexp '^[A-Z][a-z]{3}[[:digit:]]{4}$' as regexp_match;
+--------------+
| regexp_match |
+--------------+
|            1 |
+--------------+

但是如果您希望大小写不匹配导致正则表达式不匹配,您可以使用区分大小写的排序规则:

mysql> select 'abcd0123' regexp '^[A-Z][a-z]{3}[[:digit:]]{4}$' collate utf8mb3_bin as regexp_match;
+--------------+
| regexp_match |
+--------------+
|            0 |
+--------------+

查看 MySQL 正则表达式语法的文档:https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-syntax