programing

Oracle 11g - RegEx로 제약 조건 확인

muds 2023. 9. 18. 22:46
반응형

Oracle 11g - RegEx로 제약 조건 확인

저는 오라클 11g을 사용하고 있는데, 테이블을 만들려고 하는데 생성에 대한 제약 조건을 정의합니다.

일부 정보(이메일 주소, 전화번호 등)의 유효성을 확인하기 위해 검사 제약 조건을 추가하려고 했습니다.

오라클 11g에 이와 같은 작업을 할 수 있는 것이 있습니까?

constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX')

regexLib에서 가져온 regEx는 다음과 같습니다.

^[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})$

Oracle 11g(틀리면 수정)는 RegEx에 대해 이 형식을 지원하지 않는 것 같습니다.

REGEX_LIKE를 사용하는 방법을 보았지만, 그것은 오직 에만 작동하는 것 같습니다.WHERE절들

트리거나 외부 기능/스크립트가 아닌 체크 제약으로 유지하고 싶습니다.

또한 여기 다른 스레드에서 읽은 적이 있는데, 어떤 사람이 'RegEx'라고 말하는 것은 이메일 주소 형식과 그런 정보를 확인하는 좋은 방법이 아닙니다.댓글에 이유가 제시되지 않았고, 이유가 있다면 알고 싶습니다!

검사 제약 조건은 WHERE 절의 조건과 동일한 구문 규칙을 따릅니다.

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

설명서의 자세한 내용:

  • Oracle 11 - http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions007.htm#SQLRF52141 의 경우
  • Oracle 12용 - https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF52141

편집:

그러나 검사 제약 조건에서 실제로 사용할 수 있는 것에는 몇 가지 제한이 있습니다.

  • Oracle 11 - http://docs.oracle.com/cd/E11882_01/server.112/e41084/clauses002.htm#SQLRF52205
  • Oracle 12 - https://docs.oracle.com/database/121/SQLRF/clauses002.htm#SQLRF52205
CREATE TABLE MYTABLE(
  EMAIL VARCHAR2(30) CHECK(REGEXP_LIKE (EMAIL,'^[A-Za-z]+[A-Za-z0-9.]+@[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

언급URL : https://stackoverflow.com/questions/7621568/oracle-11g-check-constraint-with-regex

반응형