Programming/SQL

정규식 체크 제약조건, 체크 제약조건을 편집툴이 아닌 DDL 쿼리로 넣기.2021-08-18

최동훈1 2021. 8. 18. 16:09

이전 포스팅 에서는 PHONE의 체크 제약조건으로 단순 패턴비교 연산자를 활용하였다. 하지만 조금더 정교한 비교를 위해서 정규식을 활용해보자. 제약조건을 걸때는 간단하게 테이블 편집기도 사용 가능하지만, 연습하는 의미에서 DDL 쿼리로 직접 만들어 보겠다.

ALTER table member modify phone nvarchar2(20) check(REG_EXP(PHONE,"$010-%d{4}-%d{4}^");

이렇게 ALTER 쿼리를 활용해서 기존의 체크 제약조건을 바꾸어 보았다.

안된다.. 이럴줄 알았다... 편집기 도구에 익숙해져서 쿼리치는 법을 까먹었다...이러면 안된다.

**내가 이런식으로 쿼리를 잘못 작성하게 된 이유 후술.

 

다시 처음부터 차근차근 실행 해 보자.

새로운 제약조건은 칼럼에 주기 위해서, 기존 제약조건을 삭제해야한다.

기존 패턴비교 제약조건.

 

ALTER table member drop constraint MEMBER_PHONE_CK1;

 

이렇게 하면 기존 MEMBER_PHONE_CK1 이라는 이름을 가진 제약조건이 member 테이블에서 사라진다.

ALTER table member add constraint MEMBER_PHONE_CK1 check(REGEXP_LIKE(phone,'01[01]-\d{3,4}-\d{4}'));

 

이게 제대로된 쿼리이다.

또 이렇게 새롭게 만들어진 제약조건을 편집툴 없이 쿼리로만 볼려면 데이터 딕셔너리를 이용하면 된다.

select * from user_constraints;

그런데 데이터 딕셔너리를 쓰는 쿼리가 잘 기억 안 날 수도 있으니, ctrl + space를 누르면 이렇게 오라클이 자동완성 해 준다.(데이터 딕셔너리는 테이블 형태가 아닌 뷰 형태이다->지난 포스트 참고).

 

새로 알게된 기능 "CTRL+SPACE" 하면 자동완성 가능.

이렇게 데이터 딕셔너리로 보면  이렇게 사용자가 가진 모든 제약조건이 나온다.

 

제약조건 변경전 
제약조건 변경 후의 모습.

 

 

물론 데이터 딕셔너리를 쓰지 않고, 일반적인 경우에는 편집툴을 써서 간단히 확인한다.

 

 

**내가 맨 처음 저런 쿼리를 쓴 이유는 NOT NULL 제약조건을 DDL을 통해 넣는 쿼리가 체크 제약조건에서도 똑같은 형태로 쓰이겠지? 라는 오해에서이다.

예를 들어 name 이라는 칼럼에 기존에는 not null 조건이 없었던 것을 있도록 만들려면,

ALTER TABLE MEMBER MODIFY name nvarchar2(50) not null;

이런 쿼리를 쓴다. 어 ! 이상하다. 체크 제약조건에서는 modify가 아닌 add로써 완전 히 새로운 키워드를 넣어준거 같은데? 왜 not null, default 조건은 modify로 가능하지? 이렇게 생각할 수도 있지만, 우리가 처음 table을 만들때, 어떤 과정으로 만들었는지 살펴보자.

마치, 우리가 처음 CREATE 해서 테이블을 만들때, not null 이나 default 조건을 바로 써주던 것을 기억하면 자연스럽게 왜 이런 식으로 alter를 써야 하는지 알게될 것이다.. 그냥, 데이터 타입과 같은 요소라고 생각하면 된다.

create table "member"(
id nvarchar2(50) not null,
pwd nvarchar2(50) null,
name nvarchar2(50) not null,
num nvarchar2(50) default '111'
);

또 다시 어것을 null도 가능하게 바꿀려면,

alter table member modify name nvarchar2(50) null;

이렇게 하면 다시 null 이 가능한 레코드로 바뀌어진다.

바뀐 모습.

어? 그런데 이상하다. 분명 CREATE 문에서도 체크 제약조건을 걸수 있지 않나?

그래서 확인 해 보았다.

alter table member modify email nvarchar2(50) check(email like '%@%'));

이런 쿼리를 넣으니,

된다....! ...? 그런데 제약조건 이름인 "CONSTRAINT_NAME" 이 이상하게 나온다. 

아하 !! 그렇다면, 해당 제약조건 이름으로 alter drop을 사용하여 제약조건을 없애보자.

alter table member drop constraint SYS_C008175;

됬다!!!!!!!!!!!!!!!!!!!!!!! SYS C008175 라는 제약조건(내가 바로위 쿼리로 만든 제약조건) 이 없어졌다.

제약조건의 이름을 통해 없앴다.*

*결론*

 

 ALTER ADD, ALTER MODIFY 두 방법 모두 맞다. 

그런데 이 두 쿼리의 차이점은 "제약조건의 이름인 " CONSTRAINT_NAME 을 내가 원하는 것으로 명시적으로 설정하고 싶다면, ADD 를 쓰고 아니고 그냥 SYS ~ 이렇게 아무 이름이나 둬도 상관 없다면, MODIFY를 쓴다.

 

 

공부시간 3시간

순 공부시간 2시간. 

 

오늘은 제주도로 여행을 떠나는 날이다. 처음으로 혼자 비행기를 타고 어디론가 떠나본다. 참 설렌다.

그래도 오늘 공부를 소홀히 하지않고, 이론/실습 을 적절하게 배합해서 잘 공부한거 같다.