데이터베이스(DB)/MySQL

[MySQL] DDL - 테이블 생성(CREATE)

송기동 2024. 1. 26. 19:48
728x90

DDL (데이터 정의어, Data Definition Language)

- 테이블 등 데이터 구조를 정의하는 데 사용하는 명령어

- CREATE, ALTER, DROP, RENAME

 

테이블 생성

CREATE TABLE 테이블명 (
 
    컬럼명1 자료형 [NOT NULL] [DEFAULT 기본값] 
    [PRIMARY KEY] [AUTO_INCREMENT]
    [UNIQUE],
    
    컬럼명2 자료형, -- 각 컬럼은 콤마(,)로 연결됨
    
    ...
    
    [PRIMARY KEY (컬럼명)] -- 이런 식으로 기본키 지정도 가능
    [FOREIGN KEY (컬럼명) REFERENCES 부모테이블(부모기본키)]
    [ON DELETE 옵션]
    [ON UPDATE 옵션]
    
);

#  [NOT NULL]

- 해당 컬럼에서 NULL 값을 허용하지 않음

#  [DEFAULT 기본값]

- 레코드 삽입 시 해당 컬럼의 값을 입력하지 않았을 때 적용되는 기본값을 지정함

- 컬럼의 자료형에 맞게 기본값을 입력할 것

   ex) VARCHAR(n) → '미정'

- 자동으로 현재 날짜/시간이 삽입되도록 하기

    : 컬럼명 TIMESTAMP DEFAULT CURRENT_TIMESTAMP

#  [PRIMARY KEY (컬럼명)]

- 해당 컬럼 (or 컬럼 조합)을 각 레코드를 식별하는 기본키로 지정함

- 각 행을 고유하게 식별 가능(UNIQUE)

- NULL 값을 허용하지 않음

- 기본적으로 인덱스가 생성됨 → 검색 속도 향상

- PK를 수정하면 해당 컬럼에 대한 인덱스가 자동으로 수정됨

   (PK는 인덱스의 일종)  

#  [AUTO_INCREMENT]

- 자동으로 순차적인 번호를 생성해주는 기능 (1, 2, 3, ...)

- 기본키에 활용할 수 있음

- 새로운 레코드를 삽입할 때마다 값이 자동으로 증가하며, 일련번호를 생성함

- 중복된 값이 입력되지 않음

#  [FOREIGN KEY (컬럼명) REFERENCES 부모테이블(부모기본키)]

- 해당 컬럼을 외래키로 지정함

    → 해당 외래키는 '부모테이블'의 '기본키'를 참조함 

#  [UNIQUE]

- UNIQUE가 설정된 컬럼에 대해서는 각 레코드 값이 모두 고유한 값을 가져야 함

- 장점

   1) 데이터 중복 방지

   2) 데이터 일관성 유지

- PRIMARY KEY와의 차이점 : NULL 값 허용

- 자동으로 인덱스가 생성됨 → 검색 속도 향상 

 

#  참조 무결성 옵션

1) 부모 테이블의 레코드(행) 삭제 시 옵션

- ON DELETE CASCADE : 관련 레코드를 함께 삭제함

- ON DELETE NO ACTION : 참조되고 있는 레코드는 삭제하지 못하게 함 (기본값)

- ON DELETE SET NULL : 관련 레코드의 외래키 값을 NULL로 변경함

- ON DELETE SET DEFAULT : 관련 레코드의 외래키 값을 기본값으로 변경함

2) 부모 테이블의 레코드(행) 수정 시 옵션

- ON UPDATE CASCADE : 관련 레코드의 외래키 값을 함께 수정함

- ON UPDATE NO ACTION : 참조되고 있는 레코드는 수정하지 못하게 함

- ON UPDATE SET NULL : 관련 레코드의 외래키 값을 NULL로 변경함

- ON UPDATE SET DEFAULT : 관련 레코드의 외래키 값을 기본값으로 변경함

 


테이블 복사본 생성 (데이터 포함)

CREATE TABLE 새_테이블명
AS
SELECT 컬럼1, ... FROM 기존_테이블명
[WHERE 조건];

 

테이블 복사본 생성 (데이터 미포함)

CREATE TABLE 새_테이블명
AS
SELECT 컬럼1, ... FROM 기존_테이블명
WHERE 1=2; <- 거짓 조건 활용

- 거짓 조건을 활용하여, 모든 데이터가 조건에 맞지 않게 해서 데이터 없이 구조만 복사함

 

728x90