본문 바로가기
  • AI (Artificial Intelligence)
Skills/Database

[Oracle] CREATE 테이블을 만들어 보자

by 로샤스 2014. 6. 27.

< "CREATE TABLE" 테이블을 만들어 보자>



DDL(Date Definition Language) 객체 조작 문법중에는 create, drop ,alter문등이 있다.

그중 이번 장에서는 create를 이용하여 테이블을 만들어 보겠다.


1. 기본 데이터 타입 살펴보기 (문자형, 숫자형, 날짜형)


2. 컬럼 속성(무결성 제약조건)



테이블은 데이터를 담고 있는 상자라고 할 수 있다. 상자에 물건들을 보관하고 꺼내고 하듯이 데이터베이스에서는 데이터드을 테이블을 통해서 관리하고 있다. 데이터베이스에서 가장 기본이 되는 것이 테이블이다.

테이블은 로우(행, row, 가로축)와 컬럼(열, column, 세로축)으로 구성되며 데이터베이스 전체를 하나의 거대한 창고라 생각하면 이해하기 쉽다. 많은 물품들을 보관하는 창고에서 동일한 성격을 가진 물품들을 테이블에 담아서 관리한다라고 생각하면 된다.


CREATE TABLE 테이블명

(    컬럼1  컬럼1타입 ,

     컬럼2  컬럼2타입 ,

     컬럼3  컬럼3타입 

);


// 부가설명 

위 구문 처럼 생성을 하며 테이블의 컬럼들이 모여 하나의 로우(row)를 구성하게 된다. 테이블명은 이테이블이 무슨역할의 테이블인지 명확히 알수있도록 작명해주는것이 좋다.




1. 기본 데이터 타입 살펴보기 (문자형, 숫자형, 날짜형)


컬럼에 올수있는 타입중 기본데이터 타입이 있으며,



1. 문자형의 데이터를 담을수 있는 문자형 데이터 타입들을 살펴보겠다.


문자형 데이터 타입

 데이터 유형

 설명

 길이

 char

[(size[BYTE |CHAR])]

(가장 많이 사용)

고정 길이의 문자형 데이터 타입으로 그 크기는 SIZE만큼의 BYTE수 혹은 문자 개수가 된다.

 최대 크기는 2000BYTE가 될수 있으며 byte,char명시 안하면 디폴트로 byte가 된다.

size 값을 명시하지 않을 경우 디폴트 값은 1이다.

 VARCHAR2

[size[BYTE | CHAR]]

(가장 많이 사용)

가변 길이의 문자형 데이터 타입으로 그 크기는 최대  SIZE만큼의 BYTE수 혹은 문자수가 된다. 반드시 size값을 명시해야 한다.

 최대 크기는 4000byte가 될 수 있으며,byte나 char를 명시하지 않을 경우 디폴트값은 byte가 되며, size값을 생략할 수 없다.

 NCHAR [(size)]

고정 길이의 유니코드 문자형 데이터 타입으로 그 크기는 UTF8 엔코딩의 경우 size*3byte, AL16UTF16 엔코딩의 경우 size*2byte가 된다. 

최대 크기는 2000byte이며 size 값을 명시하지 않을 경우 디폴트값은 1이다. 

 NVARCHAR2 (size)

가변 길이의 유니코드 문자형 데이터 타입으로 그 크기는 최대 size 값이 되며, UTF8의 경우 3배, AL16UTF16 엔코딩의 경우 2배의 byte가 된다. 

최대 크기는 4000byte이며 size 값을 생략할 수 없다. 

 LONG

가변 길이의 문자형 데이터 타입 

최대 크기는 2GB이다.






2. 숫자형의 데이터를 담을수 있는 숫자형 데이터 타입


숫자형 데이터 타입

 데이터 유형

설명 

길이 

BINARY_FLOAT 

32bit 부동 소수 

4byte 

BINARY_DOUBLE

64bit 부동 소수 

8byte 

NUMBER

[ (prec |prec, scale) ] 

(가장 많이 사용)

가변 숫자 타입으로, prec로 설정한 값(1~38)은 전체 자릿수이며, scale로 설정값(-84~127)은 소수점 이하 자릿수를 의미한다. 

최대값은 21byte 






3. 날짜형 데이터 타입


날짜형 데이터 타입

 데이터 유형

설명 

길이 

DATE 

(가장 많이 사용)

고정 길이의 날짜와 시간 데이터로서 BC4712년 1월 1일부터 9999년 12월 31일까지 표현할 수 있다. 

7byte 표현형태는 NLS_DATE_FORMAT 파라미터에 명시된 값을 따른다. 

INTERVAL YEAR

[(yr_prec)] TO MONTH 

연도와 월 형태로 기간을 표현한다. yr_prec는 날짜의 연도의 최대 자릿수를 나타내며 그 값은 0~9 범위이고 디폴트 값은 2이다. 

5byte 

INTERVAL DAY

[(day_prec)] TO SECOND

[(frac_sec_prec)] 

요일, 시, 분, 초 형태로 기간을 표현한다.  Day_prec는 날짜 자릿수를 frac_sec_prec는 날짜의 초 자릿수를 나타내며 0~9까지 사용할 수 있다. 디폴트 자릿수는 day_prec가 2,  frac_sec_prec가 6이다. 

11byte 

TIMESTAMP

[(frac_sec_prec)] 

밀리초 까지 표현가능한 날짜형 데이터 타입으로 , frac_sec_prec에는 초(second) 정보의 정밀도를 나타내는데 0~9까지 올 수 있고 디폴트 값은 6이다.

precision에 다라 7~11byte로 디폴트값은 NLS_TIMESTAMP_FORMAT 파라미터에 명시된 값을 따른다. 

TIMESTAMP

[(frac_sec_prec)] WITH TIME ZONE 

시간대와 더불어 날짜와 시간을 표현한다. 시간대는 '-5:0 '나 'US/Pacific'가 올 수 있다.

frac_sec_prec은 TIMESTAMP를 위한 것이다.

13byte로 디폴트값은 NLS_TIMESTAMP_TZ_FORMAT 파라미터에 명시된 값을 따른다. 

 TIMESTAMP

[(frac_sec_prec)]WITH LOCAL TIME ZONE

TIMESTAMP WITH TIME ZONE과 비슷하나 저장시점에는 데이터베이스 시간대를 준수하나 조회시에는 조회하는 클라이언트의 시간대로 표현된다. frac_sec_prec은 TIMESTAMP를 위한 것이다. 

frac_sec_prec에 따라 7~11byte이며, 디폴트값은 NLS_TIMESTAMP_FORMAT 파라미터에 명시된 값을 따른다. 





위의 데이터 타입들중 가장많이 사용하는 것들만 사용하여 간단테이블을 만들어 보자.

create table addressbook(

name          varchar2(20)  , 

age            number(3)     ,

create_date date

);


//추가설명

주소록이라는 테이블을 만든다고 했을때 이름으로 20의 값을 주었고,

나이에 100살이상 표현가능하도록 (3)을 주었으며 , 등록한 날짜를 알기 위해 date 타입을 사용하였다.






2. 컬럼 속성(무결성 제약조건)


오라클에서는 무결성을 지키기 위해 제약조건(constraints)들을 제공하는데 이러한 제약조건들은 테이블의 컬럼에 적용되기 때문에 컬럼의 속성이라고 표현한 것이다.

여러가지 속성들에대해 알아보겠다.


NULL

컬럼이  NULL 값을 허용하는지 허용하지 않는지를 정해줄 수 있으며 NOT NULL을 데이터 타입 다음에 명시하면 NULL값을 허용하지 않는 다는 것이다.default 값으로 NULL이 적용된다. 


create table addressbook(

name          varchar2(20)  not null

age            number(3)     null,

create_date date

);


//추가설명

이름을 모르는데 주소록에 추가한다는건 무언가 이상하다. 그래서 무조건 이름을 알아야 하게 조건을 not null로 주었다.

insert로 데이터를 넣을때 not null인 컬럼에 데이터를 넣어주지 않으면 오류가 발생한다.




UNIQUE

테이블에 있는 데이터를 유일하게 식별하기 위한 무결성 제약조건 중 하나이다.

만약에 주소록 테이블에 이메일까지 저장을 하게된다면 이메일은 그 누구와도 중복되지 않고 유일하다는 걸 알고 있을 것이다.  UNIQUE는 중복되지 않고 유일하게 그 데이터를 식별하기 위해 사용된다.


create table addressbook(

name          varchar2(20)  not null, 

age            number(3)      null,

email          varchar2(100) unique  ,

create_date date

);


//추가설명

이메일은 " ID@도메인명 " 같은 이메일계정이 있을수 없다 있다면 이상한 것이다. 그렇기에  unique를 사용하여 같은 이메일계정이 들어가지 않도록 사용해준다.

단. unique 키 컬럼에 NULL값을 넣으면 null 데이터를 유일한 값인지에 대한 비교를 안하고 무시한다. 왠만하면 unique not null 을 해주는 것이 좋다.




기본키( PRIMARY KEY )

UNIQUE와 동일하게 한 테이블에 있는 데이터들을 유일하게(UNIQUE) 식별하기 위한 무결성 제약조건이다.

다른 점은 NOT NULL 속성을 자동으로 가지게 된다. 즉 UNIQUE + NOT NULL 이라 할 수 있다.

한 테이블에 하나의 기본키만 존재해야 하며 복합키라 하여 2개이상의 컬럼을 묶어서 기본키로 만들 수도 있다.


create table addressbook(

name          varchar2(20)  not null    , 

age            number(3)      null        ,

email          varchar2(100) primary key,

create_date date

);


또는 복합키  표현방법.


create table addressbook(

name          varchar2(20)  not null    , 

age            number(3)      null         ,

email          varchar2(100)              ,

create_date date                            ,

constraint "book_pk"  primary key(email,name)

);


//추가설명

지금은 간단하게 문법설명을 위해  pk(primary key)를 지정한 것이라 논리적으로 이상하더라도 

문법에대해 공부한다 생각하고 이해해 주길 바란다.

복합키또는 단일컬럼을 pk로 만들때도 constraint라는 키워드를 통해 사용하여도 만들어진다.




외래 키( FOREIGN KEY )

테이블에 저장된 각각의 데이터를 유일하게 구분하는 키를 기본키(Primary Key)라 부르며, 각 테이블 간에 연결을 만들기 위해서 테이블에서 다른 테이블의 참조되는 기본키 컬럼을 외래키(Foregin Key)라 한다.




create table addressbook(

name          varchar2(20)  not null    , 

age            number(3)      null        ,

email          varchar2(100) unique    ,

create_date date                            ,

constraint "외래 키 이름" foreign key  ( 컬럼명 )

references 참조테이블명 ( 참조컬럼 ) 

);


//추가설명

외래키를 지정하기 위해선 외래키를 지정하기 위한 참조테이블과 참조테이블의 참조컬럼을 지정해주어야 한다. 





CHECK

입력되는 값을 체크하여 일정한 조건에 해당되는 값만 입력될 수 있게 하는 제약조건이다.


create table addressbook(

name          varchar2(20)  not null    , 

age            number(3)      null        ,

email          varchar2(100) unique    ,

create_date date                            ,

gender        varchar2(10)

constraint check_gender check( gender IN('남성','여성') )

);


//추가설명

gender 컬럼에는 check조건이 사용되어 '남성' 이거나 '여성' 두 종류 값만 입력할 수 있다.





디폴트(default)

컬럼에 특정 값을 디폴트값으로 설정하면 테이블에 데이터를 입력할 때 해당 컬럼에 값을 입력하지 않을 경우 디폴트로 설정한 값이 자동으로 입력된다.

컬럼 타입 다음에 "DEFAULT 디폴트값"을 명시하면 되며 null이나 not null 앞에 위치시켜야 한다.


create table addressbook(

name          varchar2(20)  not null    , 

age            number(3)      null         ,

email          varchar2(100) unique     ,

create_date date              default sysdate                          

);


//추가설명

오라클에서 현재 날짜와 시간을 갖고 있는 SYSDATE를 디폴트값으로 설정한다면 이테이블에 데이터를 넣는 로직을 구현하는 개발자 입장에서는 이 컬럼에 신경을 쓰지 않더라도 데이터가 입력될때마다 현재 날짜와 시간이 자동으로 입력된다.





테이블의 제거( Drop table )

여태까지 create table 테이블명 으로 테이블을 만들었다면 , 테이블을 제거하는 방법에 대해 알아보자.


DROP TABLE [스키마명.] 테이블명 [ CASCADE CONSTRAINTS ];


DROP TABLE addressbook;

table ADDRESSBOOK이(가) 삭제되었습니다.


[ ] 안에 조건은 생략가능 하며 DROP TABLE은 DDL(Date Definition Language) 객체 조작 문법이므로 한번삭제하면  ROLLBACK에 의해 복원될 수 없으며 데이터들과 함께 데이터베이스에서 사라진다. 테이블을 삭제할때는 연관된 제약조건들도 삭제되며, 참조 제약조건(외래 키)들까지 자동으로 삭제시키기 위해선 [ CASCADE CONSTRAINTS ]옵션을 붙여야 한다. 만약 참조 제약조건들이 존재하는데 테이블을 삭제한다면 오류가 나거나 삭제가 안된다.






-뇌를 자극하는 오라클 프로그래밍 책을 참고하였습니다.













출처 : http://dkatlf900.tistory.com/83











댓글