[SQL] Oracle SQL - 제약조건

2024. 10. 5. 15:06SQL

자바와 데이터베이스 연동을 하여 진행하다 보니까, sql에 대한 공부가 필요해졌다.

그리고 조만간 sqld자격증 시험도 볼 생각이라서 조금씩 공부를 병행해야 한다.

아, 참고론 나는 현재 Oracle SQL을 사용 중이다.

 

그럼 오늘은 sql의 제약조건에 대해 알아보자.


 

기본키 (Primary Key)

여러 컬럼으로 구성된 데이터의 가장 대표적인 컬럼

  • 컬럼 하나의 값 만으로 레코드를 대표할 수 있는 값
  • 기본키는 빈 값을 지정할 수 없다(not null)
  • 다른 항목과 중복되는 값을 가질 수 없다(unique)
  • 예를 들어 상품의 바코드, 사람의 주민등록번호, 도서의 ISBN, 게시글의 글 번호 등이 이에 해당한다.
create table ... (
	id	 number		primary key,
	...
);

 

고유키 (Unique)

같은 테이블의 다른 레코드와 같은 값을 가질 수 없다.

  • 대표성을 지니지는 않더라도, 다른 레코드의 값과 중복되면 안될 경우에 사용한다.
  • 칼럼에 unique 특성만 지정한 경우에는 PK와 달리 빈 값을 허용한다.
  • 회원정보의 id와 같은 정보에 지정한다.
create table member (
		...
		userid		varchar2(100)		unique,
	);

 

체크 (Check)

검사, 특정 조건을 만족해야만 값을 넣을 수 있다.

  • 조건을 검사하여 조건을 만족하지 않는 값이 insert 시도되면 예외를 발생시키고, insert를 수행하지 않는다.
  • 예를 들어, 상품가격을 저장하는 칼럼은 0보다 작을 수 없다라는 조건을 체크한다.
create table product (
        ...
        price		number		check(price >= 100)
);	

create table Phonebook (
    	favorite	char(1)		check(favorite in ('Y','N')),
);

 

Not null

필수, 빈 값을 넣을 수 없다.

  • 일반적인 컬럼에는 값을 반드시 입력해야 하는 것은 아니다. 원한다면 컬럼의 값을 비워드고 레코드 생성을 할 수 있는데 이때 null 형식으로 되어있다.
  • not null이 걸린 컬럼에는 빈 값을 지정할 수 없어서 반드시 값을 입력해야 한다.
  • 예를 들어, 어떤 게시판의 글을 작성할 때 첨부파일은 넣어도 되고 넣지 않아도 되지만 게시판의 제목과 내용은 반드시 입력해야 한다. 이때, 제목과 내용의 컬럼에는 not null 조건이 적용되어 있는 형태라고 할 수 있다.
create table board (
        title		varchar2(100)		not null,
        content		varchar2(2000)		not null
);

 

기본키 (Default)

값을 입력하지 않으면 특정값을 자동으로 입력함

  • 특정 컬럼에 대해 값을 별도로 지정하지 않았을 때 기본값으로 자동 입력되는 형식
  • 게시글의 생성날짜와 회원 유형 등이 해당한다.
    예를 들어, 회원의 유형이 여러 형태라고 할 때,
    별도로 지정하지 않으면 일반회원
    직접 지정하여 값을 입력하면 매니저 등급회원
create table board (
        writeDate	date		default sysdate,
        deleted		char(1)		default 'N'
);

 

외래키 (Foreign key)

다른 테이블에 데이터가 있어야 해당 항목을 참조할 수 있는 컬럼

  • 가족 다른 테이블에 레코드가 추가되어 있어야 해당 값을 참조하여 생성할 수 있다.
  • 참조받는 테이블을 부모테이블, 참조하는 테이블을 "자식테이블" 이라고도 한다.
  • 예를 들어, 게시글 <- 댓글, 상품코드 <- 매출등록 과 같은 관계에 해당한다

시퀀스 (Sequence)

기본키를 명확하게 설정할 수 있는 테이블 형식도 있지만 데이터의 기본 구성만으로는 기본키를 지정하기 힘든 경우도 있다.

이럴 때 보통 1부터 시작하는 정수를 이용하여 index형식의 기본키를 지정하여 사용한다.
하지만 데이터를 추가할 때 마다 마지막으로 사용했던 기본키를 불러와서 추가하기에는 번거롭다.
이러한 문제를 해결하기 위해 시퀀스 요소와 default 형식을 함께 사용할 수 있다.

번호를 자동으로 관리해주는 sequence

create sequence board_seq	-- board 테이블에서 사용할 sequence생성
    start with 1		-- 1부터 시작
    maxvalue 99999		-- 최대값을 9999
    increment by 1		-- 1씩 증가한다
    nocache			-- 캐시를 사용하지 않고
    nocycle;		-- 마지막 범위까지 사용해도 다시 1로 돌아가지 않는다

select board_seq.nextval from dual;	-- 다음 값 불러오기
select board_seq.currval from dual;	-- 마지막으로 사용했던 값(현재값) 불러오기
-- dual은 데이터를 불러오기 위한 가상 테이블

시퀀스를 활용하여 테이블에 기본값 부여하기

create table phonebook (
    idx			number			default board_seq.nextval primary key,
    name		varchar2(100)	not null,
    pnum		varchar2(20)	not null,
    age			number			check(age >= 0),
    favorite	char(1)			check(favorite in ('Y', 'N'))
);

위 create문에서 sequence 생성 없이 간단하게 사용하고 싶다면 아래와 같이 작성할 수 있다.
단, nocache와 cocycle은 적용되지 않는다. (오라클 12c부터 적용가능 -> 아래의 generated as ~~ 적힌 부분)

create table phonebook (
    idx	number	generated as identity primary key,
    ...
);

 


아직 sql문이 익숙하지 않아서 테이블 생성하는것도 버겁긴 하다.

테이블 생성에도 많은 제약조건과 시퀀스들이 필요하기 때문에 이에 대한 지식은 꼭 필요한 것 같다.

반복만이 살길이다...