CREATETABLE ACCOUNT_ROLE ( USER_ID INTEGERNOTNULL, ROLE_ID INTEGERNOTNULL, GRANT_DATE TIMESTAMPWITHOUTTIME ZONE, PRIMARY KEY (USER_ID, ROLE_ID), -- 기본키는 USER_ID + ROLE_ID로 한다 CONSTRAINT ACCOUNT_ROLE_ROLE_ID_FKEY FOREIGNKEY (ROLE_ID) -- ROLE_ID 컬럼은 ROLE 테이블의 ROLE_ID 컬럼을 참조한다 REFERENCESROLE (ROLE_ID) MATCH SIMPLE -- ROLE_ID 컬럼은 ROLE 테이블의 ROLE_ID컬럼에 대한 삭제 혹은 변경 시 아무것도 하지 않는다 ONUPDATENOACTIONONDELETENOACTION, CONSTRAINT ACCOUNT_ROLE_USER_ID_FKEY FOREIGNKEY (USER_ID) -- USER_ID 컬럼은 ACCOUNT 테이블의 USER_ID 컬럼을 참조한다 REFERENCESACCOUNT (USER_ID) MATCH SIMPLE -- USER_ID 컬럼은 ACCOUNT 테이블의 USER_ID 컬럼에 대한 삭제 혹은 변경 시 아무것도 하지 않는다 ONUPDATENOACTIONONDELETENOACTION );
ACCOUNT 테이블과 ROLE 테이블은 다대다의 매칭관계이다.
두 테이블의 내용이 매칭될 수 있도록 ACCOUNT_ROLE 테이블을 생성하여 1대다의 관계를 만들어 준다.
CTAS는 CREATE TABLE AS SELECT의 약어로써 SELECT문을 기반으로 CREATE TABLE을 할 수 있는 CREATE문이다.
3-2. CTAS 문법
1 2 3
CREATETABLE NEW_TABLE -- 새로운 테이블의 이름을 설정한다 AS SELECT문 -- SELECT문을 작성한다
1 2 3
CREATETABLE NEW_TABLE (NEW_COLUMN_1, NEW_COLUMN_2) -- 새로운 테이블명의 이름과 컬럼명을 설정한다 AS SELECT문 -- SELECT문을 작성한다
1 2 3
CREATETABLEIFNOTEXISTS NEW_TABLE -- 기존에 테이블이 존재하지 않는 경우만 생성한다 AS SELECT문 -- SELECT문을 작성한다
3-3. CTAS 실습
[MISSION] 액션영화의 정보만으로 신규 테이블을 생성
1
SELECT * FROMCATEGORYWHERE CATEGORY_ID = 1;
1 2 3 4 5 6 7 8 9 10 11
SELECT A.FILM_ID, A.TITLE, A.RELEASE_YEAR, A.LENGTH, A.RATING FROM FILM A, FILM_CATEGORY B WHERE A.FILM_ID = B.FILM_ID AND B.CATEGORY_ID = 1;
>> 액션 영화 테이블 생성
1 2 3 4 5 6 7 8 9 10 11 12
CREATETABLE ACTION_FILM AS SELECT A.FILM_ID, A.TITLE, A.RELEASE_YEAR, A.LENGTH, A.RATING FROM FILM A, FILM_CATEGORY B WHERE A.FILM_ID = B.FILM_ID AND B.CATEGORY_ID = 1;
1
SELECT * FROM ACTION_FILM;
4. 테이블 구조 변경
한번 만들어진 테이블이라고 하더라도 데이블 구조를 변경할 수 있다. 이 기능으로 인해 업무변화에 유연하게 대처할 수 있다.
>> 테이블 구조 변경 실습
1 2 3 4 5 6
CREATETABLE LINKS ( LINK_ID SERIAL PRIMARY KEY, TITLE VARCHAR (512) NOTNULL, URLVARCHAR (1024) NOTNULLUNIQUE );
1 2 3
-- 1) ACTIVE 컬럼을 추가 ALTERTABLE LINKS ADDCOLUMN ACTIVE BOOLEAN; SELECT * FROM LINKS;
1 2 3
-- 2) ACTIVE 컬럼을 제거 ALTERTABLE LINKS DROPCOLUMN ACTIVE; SELECT * FROM LINKS;
1 2 3
-- 3) TITLE 컬럼을 LINK_TITLE 컬럼으로 변경 ALTERTABLE LINKS RENAMECOLUMN TITLE TO LINK_TITLE; SELECT * FROM LINKS;
1 2 3
-- 4) TARGET 컬럼을 추가 ALTERTABLE LINKS ADDCOLUMN TARGET VARCHAR(10); SELECT * FROM LINKS;
1 2 3 4
-- 5) TARGET 컬럼의 DEFAULT값을 "_blank"로 설정 ALTERTABLE LINKS ALTERCOLUMN TARGET SETDEFAULT'_blank'; SELECT * FROM LINKS;
-- SUPPLIERS 테이블에 컬럼 추가 후 FK 생성 ALTERTABLE SUPPLIERS ADDCOLUMNGROUP_IDINTNOTNULL; -- SUPPLIERS 테이블에 GROUP_ID 컬럼 추가
ALTERTABLE SUPPLIERS ADDFOREIGNKEY (GROUP_ID) REFERENCES SUPPLIER_GROUPS (ID); -- SUPPLIER_GROUPS 테이블의 ID 컬럼을 참조하여 SUPPLIERS 테이블의 GROUP_ID 컬러의 값을 지정
1 2 3 4 5 6 7 8 9
-- 아래와 같은 뷰를 생성 (뷰는 실체하는 데이터가 아닌 보기용) CREATEVIEW SUPPLIER_DATA AS SELECT S.ID, S.NAME, G.NAME "GROUP" FROM SUPPLIERS S, SUPPLIER_GROUPS G WHERE G.ID = S.GROUP_ID;
1) 먼저 SUPPLIERS 테이블의 생성 과정 (DDL)를 살펴 본다
[SUPPLIERS 테이블 --> 우클릭 --> SQL 생성 --> DDL]
지금 SUPPLIERS 테이블의 GROUP_ID 컬럼은 SUPPLIER_GROUPS 테이블의 ID 컬럼을 참조하고 있다.
그렇다면 여기서 부모 테이블인 SUPPLIER_GROUPS 테이블의 테이블명을 바꾸면 자식 테이블인 SUPPLIERS 테이블은 어떻게 될까?
2) SUPPLIER_GROUPS 테이블의 이름을 “GROUPS” 로 바꾼다
1
ALTERTABLE SUPPLIER_GROUPS RENAMETOGROUPS;
다시 SUPPLIERS 테이블의 DDL을 확인:
이제 SUPPLIERS 테이블의 GROUP_ID 컬럼은 GROUPS 테이블의 ID 컬럼을 참조하고 있다.