1. 쓰레기 데이터 걸러내기
DB 서버를 사용하는 것은 생각보다 많은 자원(돈)이 든다.
그런데 그 서버 안에 불필요한 데이터가 너무 많이 차지하고 있다면?
그래서 정작 저장해야하는 데이터를 저장하려하니 공간이 부족하다면?
우리는 데이터를 입력할 때 자료형과 제약 조건을 통해 데이터를 걸러내고 정리하는 것이 필요하다.
2. 자료형
1) 문자형
- 가변형
가변형은 내가 사용하고 싶은 만큼만 사용한다.
1바이트를 사용하면 나머지 9바이트는 재사용 가능.
용량을 많이 절약할 수 있다.
하지만 사용된 사이즈를 계산해야 함으로 속도가 느린 문자 타입.
주로 길이가 심하게 변하는 게시판의 제목등에 많이 사용된다. : varchar(5) 'SKY';
예) 아이디, 비밀번호, 이름, 주소 ~~
- 고정형
고정형은 정해져있는 만큼만 사용한다.
1바이트의 문자열이 할당 되더라도 10바이트를 전부 사용한다.
처리속도가 가장 빠른 문자 타입. 하지만 메모리 낭비가 가장 심함.
따라서 쓰이는 곳은 코드표, 우편번호, 주민번호등 길이가 일정한 컬럼에만 사용된다.
용량이 남는 경우 공백으로 채워진다.
따라서 검색시 문제가 될 수 있음으로 설계된 크기를 전부 사용하는 것을 권장함. : char(5) 'SKY';
예) 주민번호, 우편번호, 계좌번호 ~~
이렇게 보면 가변형이 편리해보이지만 가변형은 데이터를 계산하는 시간이 걸리기에 고정형이 속도는 훨씬 빠르다.
우리가 문자형을 지정해줄 때 어떤 방식으로 사용할 것인지를 고민하고 결정해야한다.
2) 숫자형
- int (정수형)
3) 날짜형
- 년월일시분초
- 구분기호 - 와 / 기호를 사용한다.
- 문자열 타입으로 입력한다.
- date
3. 테이블 제약조건
1) primary key
: 기본키, 유일성
: 모든 테이블에는 이 primary key가 꼭 하나 이상은 배정되어있어야 한다.
: where 조건절에 걸릴 수 있는 대표적인 칼럼을 강제할 수 있다.
예) 주민번호, 핸드폰 번호, 계좌번호, 아이디, 이메일 ~~
: 중복을 허용하지 않음.
: null값을 허용하지 않음(빈값을 허용하지 않음, 반드시 입력해야 함).
2) not null
: 빈 값을 허용하지 않음.
3) check
: 입력할 값을 특정 범위 내에서만 입력이 되게 하는 제약조건.
예) check(eng between 0 and 100)
check(addr in('Seoul', 'Jeju', 'Busan', 'Suwon'))
4) default
: 사용자가 값을 입력하지 않으면 해당 칼럼이 정의한 기본값을 자동으로 입력해준다.
5) unique
: primary key는 아니지만 중복되어진 데이터를 받지 않게 하는 조건이다.
: primary key와 unique의 차이점은 unique는 null 값을 한번 허용한다는 것이다.
6) foreign key
: 일명 외래키라고 불린다.
: 테이블을 서로 조인하는 경우 부모와 자식 관계를 설정할 때 사용한다.
create table sungjuk(
sno int primary key -- 기본키(유일성)
,uname varchar(50) not null
,kor int check(kor between 0 and 100) -- 국어점수 0 ~ 100 사이만 입력 가능
,eng int check(eng between 0 and 100) -- 영어점수 0 ~ 100 사이만 입력 가능
,mat int check(mat between 0 and 100) -- 수학점수 0 ~ 100 사이만 입력 가능
,addr varchar(20) check(addr in('Seoul', 'Jeju', 'Busan', 'Suwon'))
,tot int default 0
,aver int default 0
,wdate date default sysdate -- 현재 날짜 함수
);
4. 테이블 제약조건 에러메세지
상단의 코드와 비교해가면서 에러메세지를 확인해보자.
1) primary key 에러메세지
--ORA-00001: unique constraint (SYSTEM.SYS_C007030) violated
insert into sungjuk(sno, uname) values(1, '홍길동'); -- 2번 실행시 에러 발생
: 무결성 제약 조건 위배(sno는 primary key이기에 1은 한번만 들어갈 수 있다).
2) not null 에러메세지
--ORA-01400: cannot insert NULL into ("SYSTEM"."SUNGJUK"."UNAME")
insert into sungjuk(sno) values(1);
: uname 칼럼에 반드시 값을 입력해야 한다.
3) check 에러메세지
--ORA-02290: check constraint (SYSTEM.SYS_C007028) violated
insert into sungjuk(sno, uname, kor, eng, mat)
values(1, '홍길동', -10, 20, 300);
: 국영수 점수는 0 ~ 100 사이만 가능하다.
--ORA-02290: check constraint (SYSTEM.SYS_C007029) violated
insert into sungjuk(sno, uname, kor, eng, mat, addr)
values(1, '홍길동', 10, 20, 30, 'Incheon');
: addr값은 'Seoul', 'Jeju', 'Busan', 'Suwon' 값만 가능하다.
4) default
--tot과 aver는 0 입력, wdate는 현재 날짜가 입력됨
insert into sungjuk(sno, uname, kor, eng, mat, addr)
values (2, '무궁화', 10, 20, 30, 'Seoul');
5) too many values 에러
칼럼 개수와 값 개수가 일치하지 않는 경우
--SQL 오류: ORA-00913: too many values
insert into sungjuk(sno, uname, kor, eng, mat)
values (2, '무궁화', 10, 20, 30, 'Seoul');
'⁂ Oracle DB > : 기본 익히기' 카테고리의 다른 글
[Oracle] #3-5 having 조건절, CASE WHEN ~ THEN END 구문 (0) | 2022.08.23 |
---|---|
[Oracle] #3-4 데이터 가공하기 : distinct, group by, 집계함수 (0) | 2022.08.22 |
[Oracle] #3-2 시퀀스 (0) | 2022.08.22 |
[Oracle] #3-1 sort정렬과 Alter문 (0) | 2022.08.22 |
[Oracle] #2-3 Where 조건절(연산자, between, in, like)과 Null값 (0) | 2022.08.19 |