Estoy usando Oracle 11g, y tratando de crear una tabla de definir restricciones sobre la creación.

Yo estaba tratando de agregar restricción check para validar cierta información (como dirección de correo electrónico, número de teléfono, etc…)

Hay algo en Oracle 11g, que me permitiera hacer algo como esto?

constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX')

El regEx quería usar (agarró de regexLib) es:

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

Creo Oracle 11g (corríjanme si estoy equivocado) no admite este formato de RegEx…

He visto que utilizan métodos de REGEX_LIKE, pero parece que solo funciona en WHERE cláusulas.

Me gustaría tenerla como una restricción de comprobación y no un disparador o una función externa/script.

También, he leído en otros hilos aquí, a alguien diciendo RegEx’ no son una buena manera de verificar la dirección de correo electrónico de formato y la información. Ninguna razón se da en el comentario, y me gustaría saber por qué, si la razón por la que hay!

  • Que regex debe ser tomado y tiro. Espero que no gusta mucho que en RegexLib. «alum«? Inútil cuantificadores? Faltan signos de puntuación? Aparte de eso, regex no es bueno para la validación de direcciones de correo electrónico debido a que el formato es demasiado variable para un confiable regex (siempre vas a perder válida de correo electrónico y aceptar inválidas). Lo mejor que puedes hacer es comprobar la presencia de un @ signo, y tratar de enviar un e-mail de confirmación a la misma. Si se realiza correctamente, y si usted recibe un correo de vuelta, usted sabe que la dirección es válida y activa.
  • Lo siento, he cambiado el regEx para la real, Que era una especie de un mash up de la original y algo que he tratado de documentación de Oracle.
InformationsquelleAutor Pacane | 2011-10-01

2 Comentarios

  1. 14

    Una restricción check que sigue las mismas reglas de sintaxis como de las condiciones de la cláusula where:

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

    Más detalles en el manual:

    Edición:

    Sin embargo, hay algunas restricciones en lo que realmente se puede utilizar en una restricción de comprobación:

    • Tal vez usted me puede decir, he intentado esto : «alter table PERIODISTA add constraint check_email de verificación (REGEXP_LIKE(COURR_JOUR,’^[a-zA-Z][a-zA-Z0-9_\.\-][email protected]([a-zA-Z0-9-]{2,}\.)+([a-zA-Z]{2,4}|[a-zA-Z]{2}\.[a-zA-Z]{2})$’,’I’))» y todavía no puedo introducir una dirección de correo electrónico válida en una instrucción insert. Tomé esta Expresión en regEx lib, pero no estoy seguro de que es soportado por Oracle. He leído algunas partes de la documentación acerca de regEX y no parece que el uso de esta norma para los números, parecía algo así :num o algo similar…
    • No es del todo cierto que «nada que puede ser utilizado en una condición where puede ser utilizado en una restricción check.» Por ejemplo, una restricción de comprobación no puede hacer referencia a columnas de otras tablas, no puede hacer llamadas a funciones que no son deterministas, y no se pueden hacer llamadas a funciones definidas por el usuario. Consulte Restricciones las Restricciones Check [11g Release 2 (11.2)].
    • buen punto, gracias. Me estaba refiriendo a la sintaxis, en lugar de la real expresiones. Me aclaró mi post.
    • Los enlaces están rotos :/
    • gracias, actualizado
  2. 0
    CREATE TABLE MYTABLE(
      EMAIL VARCHAR2(30) CHECK(REGEXP_LIKE (EMAIL,'^[A-Za-z]+[A-Za-z0-9.][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'))
    );
    
    ALTER TABLE MYTABLE ADD(CONTACT NUMBER(10) CHECK(REGEXP_LIKE(CONTACT,'[0-9]{10}')));
    
    
    Explanation of Regular Expression
    ^           #start of the line
      [_A-Za-z0-9-]+    #  must start with string in the bracket [ ], must contains one or more (+)
      (         #  start of group #1
        \.[_A-Za-z0-9-]+   #     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
      )*            #  end of group #1, this group is optional (*)
        @           #     must contains a "@" symbol
         [A-Za-z0-9]+       #        follow by string in the bracket [ ], must contains one or more (+)
          (         #      start of group #2 - first level TLD checking
           \.[A-Za-z0-9]+  #        follow by a dot "." and string in the bracket [ ], must contains one or more (+)
          )*        #      end of group #2, this group is optional (*)
          (         #      start of group #3 - second level TLD checking
           \.[A-Za-z]{2,}  #        follow by a dot "." and string in the bracket [ ], with minimum length of 2
          )         #      end of group #3
    $           #end of the line
    • Por favor, añadir explicaciones por sus respuestas.

Dejar respuesta

Please enter your comment!
Please enter your name here