在检查约束中使用 rexexp Mysql
Use rexexp in check constraint Mysql
我想在名为 code
的 accomodatie
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
我想在名为 code
的 accomodatie
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