Oracle 11g - Check constraint with RegEx

16,184

A check constraint follows the same syntax rules as conditions for a WHERE clause:

alter table foo
  add constraint check_email 
  check (REGEXP_LIKE(email,'your_regex_goes_here','I')); 

More details in the manual:

Edit:

There are however some restrictions on what you can actually use in a check constraint:

Share:
16,184
Pacane
Author by

Pacane

wat?

Updated on July 23, 2022

Comments

  • Pacane
    Pacane almost 2 years

    I'm using Oracle 11g, and trying to create a table define constraints on the creation.

    I was trying to add check constraint to validate some information (like e-mail address, phone number, etc...)

    Is there something in Oracle 11g that would allow me to do something like this?

    constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX')
    

    The regEx I wanted to use (grabbed from regexLib) is:

    ^[a-zA-Z][a-zA-Z0-9_\.\-]+@([a-zA-Z0-9-]{2,}\.)+([a-zA-Z]{2,4}|[a-zA-Z]{2}\.[a-zA-Z]{2})$
    

    I think Oracle 11g (correct me if I'm wrong) doesn't support this format for RegEx...

    I've seen methods using REGEX_LIKE, but it seems to only work in WHERE clauses.

    I'd like to keep it as a check constraint and not a trigger or an external function/script.

    Also, I've read in other threads here, someone saying RegEx' are not a good way of verifying e-mail address format and such information. No reason was given in the comment, and I'd like to know why, if a reason there is!

  • Pacane
    Pacane over 12 years
    Maybe you can tell me, I've tried this : "alter table JOURNALISTE add constraint check_email check (REGEXP_LIKE(COURR_JOUR,'^[a-zA-Z][a-zA-Z0-9_\.\-]+@([a-zA-Z‌​0-9-]{2,}\.)+([a-zA-‌​Z]{2,4}|[a-zA-Z]{2}\‌​.[a-zA-Z]{2})$','I')‌​)" and I still can't enter a valid e-mail address in an insert statement. I took this RegEX on regEx lib, but I'm not sure it's supported by Oracle. I've read some parts of the documentation about regEX and it didn't seem to use this standard for numbers, it seemed to use something like :num or something similar...
  • DavidRR
    DavidRR over 11 years
    It is not quite true that "anything that can be used in a WHERE condition can be used in a check constraint." For example, a check constraint cannot refer to columns in other tables, cannot make calls to functions that are not deterministic, and cannot make calls to user defined functions. See Restrictions on Check Constraints [11g Release 2 (11.2)].
  • a_horse_with_no_name
    a_horse_with_no_name over 11 years
    @DavidRR: good point, thanks. I was referring to the syntax, rather than the real expressions. I clarified my post.
  • DanielM
    DanielM over 7 years
    Links are broken :/
  • Pushkr
    Pushkr over 4 years
    Please add explanations for your answers.