Programming/SQL

엔티티 제약조건,(primary key, unique). 시퀀스. 2021-08-24

최동훈1 2021. 8. 24. 16:34

오라클의 제약조건에는 총 도메인 제약조건, 엔티티 제약조건, 릴레이션 제약조건 등이 있다.

전에배웠던 not null, default, check 제약조건 등은 도메인 제약조건이고, 오늘 배울 primary key, unique는 엔티티 제약조건의 일종이다. 

이 제약조건을 간단히 설명하자면 "레코드를 추가할때, 중복된 내용이 오지 못하도록 제약하는것" 이다. primary key, unique 모두 이 특성을 공통으로 가지고 있고 차이점이라면, primary key는 중복 제거가 주 목적이 아니라 "해당 레코드를 식별할수 있는 유일한 키"가 주 목적이기 때문에 null 값은 올 수 없다.

 

 

우선 새로운 개념의 적용을 위해 DDL 구문인 CREATE로 새 테이블을 만들었다.

CREATE table "test"(
id nvarchar2(20) constraint test_nullable not null,
pwd nvarchar2(20),
content nvarchar2(50)
)

id에 primary key 제약조건을 줄려고 쿼리를 추가해 보았다.

alter table "test" add constraint test_pk1 primary key(id);

이렇게 쿼리를 넣은대로 알맞게 제약조건이 다 들어갔다. 또 테이블을 만드는 과정에서 id의 not null 제약조건도 별도의 이름을 붙일수 있다는 것을 알게 되었다. 만약 "constraint 제약조건이름" 을 붙이지 않고 그냥 not null 이렇게 쿼리를 쓴다면, 오라클이 자체적으로 부여한 SYS 00757 이런 이름이 부여된다.

그런 다음에는 pwd에 기존 테이블을 만들때부터 없었던 not null 조건을 pwd 칼럼에 추가하고자 한다.

pwd 도 나중에 제약조건을 추가해 주려고 했는데 안된다.

ALTER table "test" add constraint test_nullable2 not null(pwd) ;

이 쿼리를 썼는데 안된단다. 음? 분명, UNIQUE, PRIMARY KEY는 안됬는데..? 하고 구글링 해보니, 각 제약조건의 종류마다 추가 해주는 쿼리가 다 다르다고 한다.

알맞은 쿼리는 이거다.

alter table "test" modify pwd constraint test_nullable2 not null;

 

어떤 제약조건이 add를 쓰는지, modify를 쓰는지 헷갈려서 이참에 정리하겠다.복잡한 것은 아닌데, 

ALTER table "test" add constraint test_pk1 primary key(id);

1.

이런식으로 테이블이 만들어진 후에

"add constraint 제약조건명 제약조건(칼럼명)"

이 쿼리가 가능한 제약조건들은,

check(),unique(),primary key() 등이고,

 

2.

"modify 칼럼명 not null / null"

"modify 칼럼명 default '값'" 이렇게 쓰는 것은

not null/ default 등이다.

+ check 제약조건도 두가지 방식 다 가능하다.

modify 를 이용한 방식 (1.)

alter table "test" modify content constraint test_ck1 check(content>=3);

add 를 이용한 방식 (2.)

alter table "test" add constraint test_ck1 check(pwd like '%a%');

**요약.

 alter table 테이블명 add primary key(칼럼명);

alter table 테이블명 add constraint 제약조건명 primary key(칼럼명);

->이렇게 명시적으로 제약조건명을 줄 수 있음.

 

   alter table 테이블명 add unique(칼럼명);

   

   alter table 테이블명 modify 컬럼명 not null;

   alter table 테이블명 modify 칼럼명 default '디폴트 값';

 

 

그렇다면 이렇게 primary key 제약조건이 붙여진 칼럼에 새로운 값을 추가해버리면 어떨까?

insert 문을 쓸수도 있지만, 쉽게 툴을 이용해서 값을 추가해 보겠다. 아래의 형광색 버튼을 누르면 데이터의 추가가 쉽게 가능하다.

 

이 렇게 첫번째 레코드와 ID 의 값이 같은 값을 넣고 저장 버튼을 눌러 보았다.

 

이렇게 내가 설정한 primary key 제약조건에 위배된다며 삽입이 안된다.

 

시퀀스란 자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체이다. 보통 PK값에 중복값을 방지하기위해 사용한다. 예를들어 게시판에 글이 하나 추가될때마다 글번호(PK)가 생겨야 한다고 해보겠다. 만약 100번까지 글 번호가 생성되어있다면 그 다음 글이 추가가 되었을 경우 글 번호가 101으로 하나의 ROW를 생성해주어야 할것이다. 이때 101이라는 숫자를 얻으려면 기존 글번호중 가장 큰 값에 +1을 하는 로직을 어딘가에 넣어야하는데 시퀀스를 사용하면 이러한 로직이 필요없이 데이터베이스에 ROW가 추가될때마다 자동으로 +1을 시켜주어 매우 편리하다. 시퀀스를 직역하면 일련번호 라는 뜻인데, 우리가 어떤 테이블에 코드를 연속적으로 삽입할때 매번 다른값, 또는 순차적으로 증가되는 값을 해당 칼럼에 삽입해야 할 경우 쓴다.

 

툴을 이용해 시퀀스를 삽입하는 법.

 

SQL로도 가능하지만 툴로 설정이 더 보편적인 방법이다. 옆 접속 인터페이스에 존재하는 시퀀스 버튼을오른쪽 클릭한다.

시퀀스 새성 창.

이렇게 창이 나오면 순서대로 지정하고 싶은 값을 넣어준다. 주기 는 여기서 1부터 100까지(MAX값)에 도달했을때, 다시 1부터 카운팅 해서 넣어줄건지를 정하는 값이다. 또한 "확인" 버튼이 없어서 당황했지만 "CTRL+ENTER"(쿼리실행 단축키)를 누르니 시퀀스가 생성이 되었다.

 

생성된 시퀀스.

그후 확인을 위해 레코드를 삽입해 보았다.

insert into "test"(id,pwd,content)
values(TEST_SEQ.nextval,'45625','오늘은 영화를 본다.ㅇ');

이렇게 ID를 삽입하는 부분에 TEST_SEQ.nextval 을 하니 차례대로 순차적인 PK가 삽입 됬다.

 

정상적으로 시퀀스가 작동하는 것을 보았다.

 

 

공부시간 3시간.

순공시간 2시간.

 

오늘 드디어 제주도로 여행 갔다와서 리프레쉬 한 마음으로 SQL의 모든 강의를 다 공부했다. 정말 끝까지 하니까 얻어가는게 있는 공부였다. 한 분야의 공부를 처음부터 끝까지 하나도 빠짐없이 정리하며, 직접 코딩하며, 맞닥트린 문제를 구글링으로 해결하며 끝내보니 참 감회가 새롭다.

 

 

제약조건 을 추가/삭제 하는 쿼리문 정리된 블로그 :

[ORACLE]오라클_ 제약조건(CONSTRAINT) 종류 및 조회/추가/삭제 :: 나만의 기록들 (tistory.com)