DB/MySQL

3. DDL (Create, Alter, Drop)

코딩마루 2022. 10. 31. 17:06

데이터 정의어(DDL)은 스키마 객체를 생성, 변경, 제거시 사용한다. 이때 스키마 객체에는 테이블 뿐만 아니라 데이터베이스에서 제공하는 뷰, synonym index 등 다양한 객체들이 포함된다. DDL은 이러한 객체들을 생성, 변경, 제거할 때 사용되게 된다.

MySQL Data Type

테이블을 선언할 때 column에 어떤 타입의 데이터를 사용할 지를 지정해야 한다. 따라서 MySQL에서 제공하는 Data Type에 대해 알아둘 필요가 있다. MySQL은 다음과 같은 Data Type을 제공한다.

숫자형 데이터 타입

Type Description
Tinyint(M) 1Byte로 정수를 표현하며 부호가 있는 타입과 없는 타입이 존재한다.
Smallint(M) 2Byte로 정수를 표현하며 부호가 있는 타입과 없는 타입이 존재한다.
Mediumint(M) 3Byte로 정수를 표현하며 부호가 있는 타입과 없는 타입이 존재한다.
Int(M) & Integer(M) 4Byte로 정수를 표현하며 부호가 있는 타입과 없는 타입이 존재한다.
Bigint(M) 8Byte로 정수를 표현하며 부호가 있는 타입과 없는 타입이 존재한다.
Decimal(M: 길이, D: 소수) 고정 소수점을 나타낸다. 이때 M은 0~65 사이의 수여야 한다.
Float(M: 길이, D: 소수) 부동 소수점을 나타낸다. (4Byte)
Double(M: 길이, D: 소수) 부동 소수점을 나타낸다. Float에 비해 2배의 정밀도를 가진다. (8Byte)

문자형 데이터 타입

Type Description
Char(M) 고정 길이를 가지는 문자열을 저장한다. M은 0~255 사이의 수여야 한다.
Varchar(M) 가변 길이를 가지는 문자열을 저장할 수 있다. M은 0~65,535 사이의 수여야 한다.
Tinytext 문자열 데이터 타입으로 최대 255개의 문자를 저장할 수 있다.
Text 문자열 데이터 타입으로 최대 63,535개의 문자를 저장할 수 있다.
Mediumtext 문자열 데이터 타입으로 최대 16,777,215개의 문자를 저장할 수 있다.
Longtext 문자열 데이터 타입으로 최대 4,294,967,295개의 문자를 저장할 수 있다.

날짜형 데이터 타입

Type Description
Date '2022-10-31'과 같이 날짜를 표현한다. (3Byte)
Datetime '2022-10-31 23:59:59'와 같이 날짜와 시간을 동시에 표현한다. (8Byte)
Timestamp '1970-01-01 00:00:00'~2037년까지 나타낼 수 있다. (4Byte)
Time '-839:59:59~+839:59:59'까지의 시간을 나타낼 수 있다. (3Byte)
Year 0000년, 1901~2155년까지의 년도를 나타낼 수 있다. (1Byte)

위 타입들 이외에도 Blob과 같이 이진 데이터를 나타내는 다른 데이터 타입들도 존재한다.

테이블 생성 (Create)

테이블을 생성하기 위해서는 아래와 같은 구조를 가진 Create문을 사용한다.

create table (Table_Name) (
    (Column1_Name) (Data_Type) ([NULL/Not NULL]) ([DEFAULT]) ([Auto_Increment]) [Primary key],
    (Column2_Name) (Data_Type) ([NULL/Not NULL]) ([DEFAULT]) ([Auto_Increment]),
    (Column3_Name) (Data_Type) ([NULL/Not NULL]) ([DEFAULT]) ([Auto_Increment]),
    ...
);

테이블을 생성할 때는 위와 같이 각 column의 이름과 어떤 타입을 가질지 정의해야 한다. 이때 해당 column에 제약 조건을 추가로 부여할 수 있다. 예를 들어서, Null 값을 허용할 수도 있고, 혀용하지 않을 수도 있으며 Default값을 지정하거나 자동으로 값이 늘어나게 하는 등의 옵션을 추가할 수 있다. primary key도 설정이 가능한데, 이때 두 개의 primary key 설정시에는 에러가 발생한다.

  • Ex) create table book (Book_name varchar(10) not null primary key, Author varchar(10) not null, Price integer not null);

테이블 수정 (Alter)

테이블을 수정할 때는 Alter문을 사용한다.

Column 추가, 삭제(add, drop)

Alter문에 add을 사용하면 column을 추가할 수 있고, drop을 사용하면 column을 제거한다. add의 경우 table 생성과 동일하게 column의 이름, 저장할 타입 그리고 제약 조건 등을 작성해주면 된다.

  • Add Ex) alter table book add company varchar(10) null;
  • Drop Ex) alter table book drop company;
alter table (Table_Name) add (Column_Name) (Data_Type) ([NULL/Not NULL]) ([DEFAULT]) ([Auto_Increment]);
alter table (Table_Name) drop (Column_Name);

Column 수정(change)

Alter문에 change 키워드를 사용하면 column을 새롭게 재정의할 수 있다.

alter table (Table_Name) change (Column_Name) (New_Name) (Date_Type) ([NULL/Not NULL]) ([DEFAULT]) ([Auto_Increment]);

테이블 이름 변경(rename)

alter 키워드를 사용하면 테이블의 이름을 변경할 수 있다.

alter table (Table_Name) rename (New_Name);

테이블 삭제 (Drop)

Drop문을 사용하면 테이블을 삭제할 수 있다. 단, 테이블들이 서로 관련되어 있는 경우 생성한 순의 반대 순으로 삭제해야 한다. 예를들어, table1과 table2가 있는데 table1의 하나의 column값들이 table2의 어떠한 column에 사용된다고 하자. 이때 table1을 먼저 삭제하는 경우 문제가 발생할 수 있다. 따라서 만약 table1을 삭제하고 싶다면 table2를 먼저 삭제해야 한다.

drop table (Table_Name);