MySQL 范围内的服务器检查约束

MySQL server check constraint with range

我试图了解如何正确使用 check 约束,但是当我使用范围时它总是失败;

mysql> create table test( code varchar(64), constraint ctr check (code like '[0-9]%')) :
Query OK, 0 rows affected (0.00 sec) 
-- Allow strings that starts with a number, but when i try to insert '5foo' for example:
mysql> insert into test (code) values ('5foo' ) ;
ERROR 3819 (HY000) : Check constraint 'ctr' is violated.

使用 normal 检查约束仍然可以正常工作,例如:

mysql> create table test( code varchar(64), constraint ctr check(code like '_foo_bar%'));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test (code) values ('5foo0barabc');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test (code) values ('55foo0barabc');
ERROR 3819 (HY000): Check constraint 'test_chk_1' is violated.

如你所见。

我想了解为什么它不起作用,如果范围在 mySQL 中不是问题(因为我之前读到检查约束本身不是它的一部分,我使用 Ver 8.0.28 for macos11 on arm64 (MySQL Community Server - GPL) btw if it's any cause) 有没有办法实现以下检查(这是什么我其实是试图实现的,上面的代码只是一个例子):([A-Z][0-9]{9})一个以大写字母开头,后面跟着9个数字的字符串。

先谢谢大家了!

MySQL(和标准 SQL)不支持 LIKE 谓词中的字符范围。 LIKE 支持的唯一模式元字符是 %_(我想 \ 可以转义其他元字符)。

Microsoft SQL 服务器实现 LIKE 的字符范围,但这是他们自己对标准 SQL.

的自定义扩展

对于MySQL,您需要使用REGEXP而不是LIKE。但是 % 不是 pattern-matching 字符。请改用等价的正则表达式 .* ,或者只保留该部分,因为正则表达式隐式允许任何字符遵循您的模式。此外,对于正则表达式,您需要使用 ^ 来使模式匹配字符串的开头,否则如果它匹配其中的任何子字符串,它将匹配。

示例:

create table test( code varchar(64), constraint ctr check (code regexp '^[0-9].*'))

选择:

create table test( code varchar(64), constraint ctr check (code regexp '^[0-9]'))