[DATABASE] DDL 이란? CREATE TABLE, ALTER TABLE, RENAME TABLE, DROP TABLE, TRUNCATE TABLE
DDL 이란?
DATA DEFINITION LANGUAGE 로 데이터 정의 언어를 의미합니다.
데이터 유형
데이터베이스의 테이블에 특정 자료를 입력할 때, 그 자료를 받아들일 공간을 자료의 유형별로 나누는 기준을 의미합니다.
테이블의 칼럼이 가지고 있는 대표적인 4가지 데이터 유형은 다음과 같습니다.
1. CHARACTER : 고정 길이 문자열 정보
2. VARCHAR : 가변길이 문자열 정보
3. NUMERIC : 정수, 실수 등 숫자 정보
4. DATE : 날짜와 시각 정보
이 외에도 Binary String Type, Binary Large Object String Type, National Character String Type, Boolean Type 등의 유형이 있습니다.
벤더사별로 표준을 따르지만 이외에 대해서는 특성에 맞추므로 타입이나 쿼리가 다를 수 있습니다.
CREATE TABLE
테이블은 일정한 형식에 의해서 생성됩니다.
생성을 위해서는 해당 테이블에 입력될 데이터를 정의하고, 어떠한 유형으로 선언할 것인지를 결정해야 합니다.
데이터를 고유하게 식별할 수 있으면서 반드시 값이 존재하는 단일 컬럼이나 후보키 중에 하나를 선정하여 기본키 컬럼으로 지정합니다.
기본키는 단일 컬럼이 아닌 여러개의 컬럼으로도 만들 수 있습니다.
테이블 생성 시에 주의해야 할 규칙
1. 객체를 의미할 수 있는 적절한 이름을 사용
2. 다른 테이블의 이름과 중복되지 않도록 지정
3. 한 테이블 내에서는 컬럼명이 중복되게 지정할 수 없음
4. 테이블 이름을 지정하고 각 컬럼들은 괄호로 묶어서 지정
5. 각 컬럼들은 , 로 구분되고, 테이블 생성문의 끝은 ; 기호로 맺음
6. 컬럼뒤에 데이터 유형은 꼭 지정되어야 함
7. 테이블 명과 컬럼 명은 반드시 문자로 시작
8. 벤더사마다 사전에 정의한 예약어는 사용 불가
9, A-Z, a-z, 0-9, _, $, # 문자만 허용
컬럼에 대한 규칙
1. DATETIME 유형에는 별도로 크기를 지정하지 않음
2. 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시
3. 컬럼의 구분은 , 로 하되 마지막 컬럼은 콤마를 찍지 않음
4. 컬럼에 대해서 CONSTRAINT 를 이용하여 제약조건을 추가 가능
테이블에 대한 생성 예제
테이블 명 : MOZI 컬럼 명 : ID (아이디) 문자 가변 자릿수 7자리 NAME (이름) 문자 가변 자릿수 20자리 AGE (나이) 숫자 3자리 제약조건 : 기본키(PRIMARY KEY) -> ID 값이 반드시 존재 (NOT NULL) -> NAME
CREATE TABLE MOZI ( ID VARCHAR(7), NAME CHAR(20) NOT NULL, AGE NUMBER(3), CONSTRAINT PLAYER_PK PRIMARY KEY (ID) );
SELECT 문장을 통한 테이블 생성
CTAS (CREATE TABLE AS SELECT) 를 통하여 테이블을 생성할 수 있습니다.
그러나 이 때에는 제약조건 중 NOT NULL 만 복제 테이블에 적용이 되고, 나머지 제약조건을 복사되지 않습니다.
제약조건
사용자가 원하는 조건의 데이터만 유지하기 위한 즉, 데이터의 무결성을 유지하기 위한 제약사항입니다.
제약조건의 종류
구분 |
설명 |
PRIMARY KEY |
테이블에 저장된 행 데이터를 고유하게 식별하기 위한 기본키를 정의한다. 하나의 테이블에는 하나의 기본키 제약만 정의할 수 있다. 정의 시 자동으로 UNIQUE 인덱스를 생성하며, NULL 값이 올 수 없다. |
UNIQUE KEY |
테이블에 저장된 행 데이터를 고유하게 식별하기 위한 고유키를 정의한다. 단, NULL 은 고유키 제약의 대상이 아니므로 NULL 행은 여러개가 될 수 있다. |
NOT NULL |
NULL 값의 입력을 금지한다. |
CHECK |
입력할 수 있는 값의 범위 등을 제한한다. |
FOREIGN KEY |
테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우를 의미한다. |
DEFAULT | DEFAULT 값을 정의시 컬럼에 데이터값이 입력되지 않은 경우 정의된 값이 자동으로 입력된다. |
ALTER TABLE
처음의 테이블 구조를 그대로 유지하는 것이 최선이지만, 변경해야 할 일들이 발생할 수도 있습니다.
주로 칼럼을 추가/삭제하거나 제약조건을 추가/삭제하는 작업을 진행합니다.
컬럼 추가
새롭게 추가된 컬럼은 테이블의 마지막 컬럼이 되며 위치를 지정할 순 없습니다.
ALTER TABLE <TABLE_NAME> ADD (<COLUMN_NAME> <COLUMN_TYPE>) ; -- ORACLE, GOLDILOCKS ALTER TABLE <TABLE_NAME> ADD <COLUMN_NAME> <COLUMN_TYPE> ; -- MS-SQL, GOLDILOCKS ALTER TABLE <TABLE_NAME> ADD COLUMN (<COLUMN_NAME> <COLUMN_TYPE>); -- GOLDILOCKS
컬럼 제거
데이터가 있거나 없거나 삭제가 가능합니다.
한 번에 하나의 컬럼만 삭제가 가능하며, 컬럼 삭제 후 최소 하나 이상의 컬럼이 테이블에 존재해야 합니다.
한 번 삭제한 컬럼은 복구가 불가능 하므로 주의해야 합니다.
ALTER TABLE <TABLE_NAME> DROP COLUMN <COLUMN_NAME>; -- ORACLE, MS-SQL ALTER TABLE <TABLE_NAME> SET UNUSED COLUMN <COLUMN_NAME>; -- GOLDILOCKS
컬럼 수정
컬럼의 데이터 유형, 디폴트, NOT NULL 제약조건 등에 대한 변경을 할 수 있습니다.
컬럼을 변경할 때는 다음을 고려해야 합니다.
1. 컬럼의 크기를 늘릴 수는 있지만 줄이지는 못한다.
2. 해당 컬럼이 NULL 값만 가지고 있거나 테이블에 아무 행도 없으면 컬럼의 폭을 줄일 수 있다.
3. 해당 컬럼이 NULL 값만 가지고 있으면 데이터 유형을 변경할 수 있다.
4. 해당 컬럼의 DEFAULT 값을 바꾸면 변경 작업 이후 발생하는 행 삽입에만 영향을 미치게 된다.
5. 해당 컬럼에 NULL 값이 없을 경우에만 NOT NULL 제약조건을 추가할 수 있다.
ALTER TABLE <TABLE_NAME> MODIFY (<COLUMN_NAME> <COLUMN_TYPE> [DEFAULT] [NOT NULL] [, .. ]); -- ORACLE ALTER TABLE <TABLE_NAME> ALTER (<COLUMN_NAME> <COLUMN_TYPE> [DEFAULT] [NOT NULL] [, .. ]); -- MS-SQL ALTER TABLE <TABLE_NAME> ALTER COLUMN <COLUMN_NAME> SET DATA TYPE <COLUMN_TYPE>; -- GOLDILOCKS ALTER TABLE <TABLE_NAME> ALTER COLUMN <COLUMN_NAME> SET DEFAULT <DEFAULT>; -- GOLDILOCKS ALTER TABLE <TABLE_NAME> ALTER COLUMN <COLUMN_NAME> SET NOT NULL; -- GOLDILOCKS
컬럼 명 변경
ALTER TABLE <TABLE_NAME> RENAME COLUMN <COLUMN_NAME> TO <NEW_COLUMN_NAME>; -- ORACLE, GOLDILOCKS sp_rename <COLUMN_NAME>, <NEW_COLUMN_NAME>, 'COLUMN'; --MS-SQL
제약조건 삭제
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <CONSTRAINT_NAME>; -- ORACLE, MS-SQL, GOLDILOCKS
제약조건 추가
ALTER TABLE <TABLE_NAME> ADD CONSTRAINT <CONSTRAINT_NAME> <CONSTRAINT_TYPE> (<COLUMN_NAME>); -- ORACLE, MS-SQL, GOLDILOCKS
RENAME TABLE
테이블 명을 변경합니다.
RENAME <TABLE_NAME> TO <NEW_TABLE_NAME>; -- ORACLE sp_rename <TABLE_NAME>, <NEW_TABLE_NAME>; -- MS-SQL ALTER TABLE <TABLE_NAME> RENAME TO <NEW_TABLE_NAME>; -- GOLDILOCCKS
DROP TABLE
테이블을 잘못 만들었거나 테이블이 더 이상 필요 없을 경우 해당 테이블을 삭제합니다.
DROP TABLE <TABLE_NAME>; -- ORACLE, MS-SQL, GOLDILOCKS
TRUNCATE TABLE
테이블 자체가 삭제되는 것이 아니고, 해당 테이블에 들어있단 모든 행들이 제거됩니다.
또한 저장 공간을 재사용 가능하도록 해제합니다.
테이블의 데이터를 일괄 삭제하는 명령어로 DML 로 분류할 수도 있지만 내부 처리 방식이나 Auto Commit 특성으로 인해 DDL 로 분류됩니다.
TRUNCATE TABLE <TABLE_NAME>: -- ORACLE, MS-SQL, GOLDILOCKS
이 내용은 'SQL 전문가 가이드, 한국데이터베이스 진흥원' 에서 공부한 내용입니다.