테이블 관리 (1)
1. 데이터 타입
테이블은 컬럼으로 이루어져 있고 컬럼은 다양한 데이터 타입을 지원한다. 이는 RDBMS가 제 역할을 하는데 있어서 매우 중요하다.
다양한 데이터 타입 지원:
- Boolean
 - Character
 - Numeric
 - Time
 - Arrays
 - JSON
 
>> Boolean, Character, Numeric
| 데이터 타입 | 세부 타입 | 설명 | 
|---|---|---|
| Boolean | Boolean | 참과 거짓의 값을 저장한다. | 
| Character | CHAR | 고정형 길이의 문자열을 저장한다.  만약 CHAR(10)인데 'ABCDE’만 입력할 경우 실제로는 'ABCDE '로 뒤에 공백을 붙여 저장한다.  | 
| VARCHAR | 가변형 길이의 분자열을 저장한다.  만약 VARCHAR(10) 인데 'ABCDE’만 입력할 경우 실제로 'ABCDE’만 저장한다. (뒤에 공백을 붙이지 않는다)  | 
|
| TEXT | 대용량의 문자데이터를 저장한다. | |
| Numeric | INT | 정수형데이터를 저장한다. 크기는 4byte이다. (범위는 -2,147,483,648 to 2,147,483,647) | 
| SMALLINT | 정수형 데이터를 저장한다. 크기는 2byte이다. (범위는 -32,768 to 32,767) | |
| float | 부동 소수점의 데이터를 저장한다. 크기는 8byte이다. | |
| numeric | NUMERIC(15, 2)와 같이 전체 크기와 소수점의 자리를 지정할 수 있다. | 
[실습]
1  | CREATE TABLE  | 
1  | INSERT INTO  | 
1  | SELECT * FROM DATA_TYPE_TEST_1;  | 

>> Time, Arrays, JSON
| 데이터 타입 | 세부 타입 | 설명 | 
|---|---|---|
| Time | Date | 일자 데이터를 저장한다. | 
| TIME | 시간 데이터를 저장한다. | |
| TIMESTAMP | 일자와 시간 데이터를 모두 저장한다. | |
| Arrays | array | 배열 형식의 데이터를 저장한다.  한개의 컬럼에 여러개의 데이터를 동시에 저장할 수 있으며 저장한 데이터의 순서로 조회할 수 있다.  | 
| JSON | JSON | JSON형식의 데이터를 저장한다.  JSON형식의 데이터를 입력해서 JSON형식대로 각 LEVEL의 데이터를 저장할 수 있다.  | 
[실습]
1  | CREATE TABLE DATA_TYPE_TEST_2  | 
1  | INSERT INTO DATA_TYPE_TEST_2  | 
1  | SELECT * FROM DATA_TYPE_TEST_2;  | 
2. 테이블 생성
테이블은 데이터를 담는 그릇으로써 반드시 생성해야만 데이터를 저장할 수 있다.
>> 테이블 생성 시 컬럼의 제약 조건
| 제약조건명 | 설명 | 
|---|---|
| NOT NULL | 해당 제약 조건이 있는 컬럼은 NULL이 저장될 수 없다. | 
| UNIQUE | 해당 제약 조건이 있는 컬럼의 값은 테이블 내에서 유일해야 한다. | 
| PRIMARY KEY | 해당 제약 조건이 있는 컬럼의 값은 테이블 내에서 유일해야 하고 반드시 NOT NULL이어야 한다. | 
| CHECK | 해당 제약 조건이 있는 컬럼은 지정하는 조건에 맞는 값이 들어가야 한다. | 
| REFERENCES | 해당 제약 조건이 있는 컬럼의 값은 참조하는 테이블의 특정 컬럼에 값이 존재해야 한다. | 
>> 테이블 생성 실습
1  | CREATE TABLE ACCOUNT  | 
1  | CREATE TABLE ROLE  | 
1  | CREATE TABLE ACCOUNT_ROLE  | 
- ACCOUNT 테이블과 ROLE 테이블은 다대다의 매칭관계이다.
 - 두 테이블의 내용이 매칭될 수 있도록 ACCOUNT_ROLE 테이블을 생성하여 1대다의 관계를 만들어 준다.
 
1  | INSERT INTO ACCOUNT  | 
1  | SELECT * FROM ACCOUNT;  | 
1  | INSERT INTO ROLE  | 
1  | SELECT * FROM ROLE;  | 

1  | INSERT INTO ACCOUNT_ROLE  | 
1  | SELECT * FROM ACCOUNT_ROLE;  | 

>> 에러
(1) 참조 누락성 제약 조건 위반
- 참조키(Foreign Key)에 해당 데이터가 존재하지 않는 경우
 
1  | INSERT INTO ACCOUNT_ROLE  | 
1  | INSERT INTO ACCOUNT_ROLE  | 
(2) 고유 제약 조건 위반
- 중복값이 없어야 하는 PRIMARY KEY에 중복이 발생한 경우
 
1  | INSERT INTO ACCOUNT_ROLE  | 
(3) 참조 시 갱신/삭제 불가
- 데이터가 참조되어 있을 때 해당 데이터를 갱신/삭제 불가한다.
 
1  | UPDATE ACCOUNT  | 
1  | DELETE FROM ACCOUNT  | 
3. CTAS (CREATE TABLE AS SELECT)
3-1. 개념
CTAS는 CREATE TABLE AS SELECT의 약어로써 SELECT문을 기반으로 CREATE TABLE을 할 수 있는 CREATE문이다.
3-2. CTAS 문법
1  | CREATE TABLE NEW_TABLE -- 새로운 테이블의 이름을 설정한다  | 
1  | CREATE TABLE NEW_TABLE (NEW_COLUMN_1, NEW_COLUMN_2) -- 새로운 테이블명의 이름과 컬럼명을 설정한다  | 
1  | CREATE TABLE IF NOT EXISTS NEW_TABLE -- 기존에 테이블이 존재하지 않는 경우만 생성한다  | 
3-3. CTAS 실습
[MISSION] 액션영화의 정보만으로 신규 테이블을 생성
1  | SELECT * FROM CATEGORY WHERE CATEGORY_ID = 1;  | 

1  | SELECT  | 
>> 액션 영화 테이블 생성
1  | CREATE TABLE ACTION_FILM AS  | 
1  | SELECT * FROM ACTION_FILM;  | 
4. 테이블 구조 변경
한번 만들어진 테이블이라고 하더라도 데이블 구조를 변경할 수 있다. 이 기능으로 인해 업무변화에 유연하게 대처할 수 있다.
>> 테이블 구조 변경 실습
1  | CREATE TABLE LINKS  | 

1  | -- 1) ACTIVE 컬럼을 추가  | 

1  | -- 2) ACTIVE 컬럼을 제거  | 

1  | -- 3) TITLE 컬럼을 LINK_TITLE 컬럼으로 변경  | 

1  | -- 4) TARGET 컬럼을 추가  | 

1  | -- 5) TARGET 컬럼의 DEFAULT값을 "_blank"로 설정  | 

- 
데이터 추가 해보기
1
2
3INSERT INTO LINKS (LINK_TITLE, URL)
VALUES
('PostgreSQL Tutorial', 'http://www.postgresqltutorial.com/');1
SELECT * FROM LINKS;

 
1  | -- 6) 체크 제약 조건 추가  | 
- 
TARGET 컬럼의 체크 제약 조건에 없는 ‘whatever’ 값으로 INSERT 시도
1
2INSERT INTO LINKS (LINK_TITLE, URL, TARGET)
VALUES('PostgreSQL', 'http://www.postgresql.org/', 'whatever');
 
- 
TARGET 컬럼의 체크 제약 조건에 없는 ‘whatever’ 값으로 INSERT 시도
1
2INSERT INTO LINKS (LINK_TITLE, URL, TARGET)
VALUES('PostgreSQL', 'http://www.postgresql.org/', '_self');
 
5. 테이블 이름 변경
한번 만들어진 테이블이라고 하더라도 테이블 이름을 변경할 수 있다. 이 기능으로 인해 업무변화에 유연하게 대처할 수 있다.
5-1. 테이블 이름 변경 문법
1  | ALTER TABLE OLD_TABLE_NAME  | 
5-2. 테이블 이름 변경 실습
>> 테이블 이름 변경 실습 (1)
[MISSION] VENDORS 테이블을 SUPPLIERS 테이블로 변경
1  | -- VENDORS 테이블 생성  | 

1  | -- VENDORS 테이블의 이름을 SUPPLIERS 로 변경  | 
1  | SELECT * FROM SUPPLIERS;  | 

1  | SELECT * FROM VENDORS;  | 
>> 테이블 이름 변경 실습 (2)
1  | -- SUPPLIER_GROUPS 테이블 생성  | 
1  | -- SUPPLIERS 테이블에 컬럼 추가 후 FK 생성  | 

1  | -- 아래와 같은 뷰를 생성 (뷰는 실체하는 데이터가 아닌 보기용)  | 

1) 먼저 SUPPLIERS 테이블의 생성 과정 (DDL)를 살펴 본다
[SUPPLIERS 테이블 --> 우클릭 --> SQL 생성 --> DDL]
- 지금 SUPPLIERS 테이블의 GROUP_ID 컬럼은 SUPPLIER_GROUPS 테이블의 ID 컬럼을 참조하고 있다.
 - 그렇다면 여기서 부모 테이블인 SUPPLIER_GROUPS 테이블의 테이블명을 바꾸면 자식 테이블인 SUPPLIERS 테이블은 어떻게 될까?
 
2) SUPPLIER_GROUPS 테이블의 이름을 “GROUPS” 로 바꾼다
1  | ALTER TABLE SUPPLIER_GROUPS RENAME TO GROUPS;  | 
다시 SUPPLIERS 테이블의 DDL을 확인:
- 이제 SUPPLIERS 테이블의 GROUP_ID 컬럼은 GROUPS 테이블의 ID 컬럼을 참조하고 있다.
 - 즉 테이블명의 변경이 자동으로 반영된다.
 
그렇다면 우리가 만들었던 SUPPLIER_DATA 뷰는 어떻게 되었을까?
- 테이블명이 바뀌었음에도 불구하고 자동으로 GROUPS 테이블을 참조하고 있다.
 - 즉 테이블명의 변경이 자동으로 반영된다.
 
5-3. 걸론
- ALTER TALBE 문을 활용하여 테이블의 이름을 변경 가능.
 - 테이블 이름 변경하면, 기존의 참조무걸성 제약조건이나 뷰 등이 자동으로 반영된다.
 
