2

I'm trying to understand how to properly use the check constraint, but it keeps on failing when i use ranges;

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.

Never the less using a normal check constraint works just fine, for example :

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.

as you can see.

I would like to understand why it's not working, and if ranges just aren't a thing in mySQL (because i read that the check constraint it self wasn't part of it earlier before, im using Ver 8.0.28 for macos11 on arm64 (MySQL Community Server - GPL) btw if it's of any cause) is there a way to achieve the following check (which is what im actually trying to achieve, the upper code is just an example): ([A-Z][0-9]{9}) a string that starts with an uppercase letter and is followed by 9 numbers.

Thank you guys in advance!

1 Answer 1

2

MySQL (and standard SQL) does not support character ranges in the LIKE predicate. The only pattern metacharacters supported by LIKE are % and _ (and I suppose \ to escape the other metacharacters).

Microsoft SQL Server implements character ranges for LIKE, but this is their own custom extension to standard SQL.

For MySQL, you need to use REGEXP instead of LIKE. But then % is not a pattern-matching character. Use the regular expression equivalent .* instead, or else just leave that part out, because regular expressions implicitly allow any characters to follow your pattern. Also, for a regular expression you need to use ^ to make pattern match the start of the string, otherwise it will match if it matches any substring within.

Example:

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

Alternative:

create table test( code varchar(64), constraint ctr check (code regexp '^[0-9]'))
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you !, '^([A-Z][0-9]{9})' achieves what i want with a char(10).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.