2024. 10. 5. 15:06ㆍSQL
자바와 데이터베이스 연동을 하여 진행하다 보니까, 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문이 익숙하지 않아서 테이블 생성하는것도 버겁긴 하다.
테이블 생성에도 많은 제약조건과 시퀀스들이 필요하기 때문에 이에 대한 지식은 꼭 필요한 것 같다.
반복만이 살길이다...