如何解决在检查约束 Mysql
我想在名为 accomodatie
的 code
表的主键上添加一个检查约束。此代码必须以 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>/
。斜线的使用是从 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。