본문 바로가기
SQL

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

by 스응 2023. 3. 6.
728x90
728x90

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

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

  - CREATE, ALTER, DROP, RENAME

 

테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE 테이블명 (
 
    컬럼명1 자료형 [NOT NULL] [DEFAULT 기본값] 
    [PRIMARY KEY] [AUTO_INCREMENT]
    [UNIQUE],
    
    컬럼명2 자료형, -- 각 컬럼은 콤마(,)로 연결됨
    
    ...
    
    [PRIMARY KEY (컬럼명)] -- 이런 식으로 기본키 지정도 가능
    [FOREIGN KEY (컬럼명) REFERENCES 부모테이블(부모기본키)]
    [ON DELETE 옵션]
    [ON UPDATE 옵션]
    
);
cs

#  [NOT NULL]

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

#  [DEFAULT 기본값]

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

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

      ex) VARCHAR(n) → '미정'

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

      : 컬럼명 TIMESTAMP DEFAULT CURRENT_TIMESTAMP

#  [PRIMARY KEY (컬럼명)]

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

  - 레코드별로 고유한 값을 가짐 (중복 시 오류)

  - NULL 값을 허용하지 않음 → 자동으로 NOT 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; -- 거짓 조건 활용

 

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

 

 


기타 메모

- 예약어와 동일한 이름으로 테이블명 정의하기 : `테이블명`
    → 따옴표가 아니라 백틱(`)임에 유의
320x100
반응형

댓글