[SQL] DDL (Data Definition Language)

문지은·2023년 4월 5일
0

Database with SQLite

목록 보기
2/7
post-thumbnail

DDL은 테이블 구조를 관리 (CREATE, ALTER, DROP) 하는 데이터 정의 언어이다.
SQL 데이터 정의 언어를 사용하여 테이블 데이터베이스 개체를 만드는 방법에 대해 알아보자!

⭐️ CREATE TABLE

CREATE TABLE

데이터베이스에 새 테이블 만들기

    CREATE TABLE table_name (
        column_1 data_type constraints,
    		column_2 data_type constraints,
    		column_3 data_type constraints,
    );

contacts 테이블 생성하기

    CREATE TABLE contacts (
        name TEXT NOT NULL,
        age INTEGER NOT NULL,
        email TEXT NOT NULL UNIQUE
    );

Query 실행하기

  • 실행하고자 하는 명령문에 커서를 두고 마우스 우측 버튼
    → Run Selected Query 선택

  • 명령문을 모두 선택할 필요 없으며, 실행하고자 하는 명령문 안에 커서가 올라가 있으면 가능하다.

  • 쿼리 실행 후 테이블 및 스키마 확인하기


⭐️ SQLite Data Types

Data Types 종류

NULL

  • NULL value
  • 정보가 없거나 알 수 없음을 의미 (missing information or unknown)

INTEGER

  • 정수
  • 크기에 따라 0, 1, 2, 3, 4, 6 또는 8바이트와 같은 가변 크기를 가짐

REAL

  • 실수
  • 8바이트 부동 소수점을 사용하는 10진수 값이 있는 실수

TEXT

  • 문자 데이터

BLOB (Binary Large Object)

  • 입력된 그대로 저장된 데이터 덩어리 (대용 타입 없음)
  • 바이너리 등 멀티미디어 파일
  • 예 ) 이미지 데이터

Type Affinity (타입 선호도)

  • 특정 컬럼에 저장된 데이터에 권장되는 타입
  • 데이터 타입 작성 시 SQLite의 5가지 데이터 타입이 아닌 다른 데이터 타입을 선언한다면, 내부적으로 각 타입의 지정된 선호도에 따라 5가지 선호도로 인식됨
    1. INTEGER
    2. TEXT
    3. BLOB
    4. REAL
    5. NUMERIC
  • 타입 선호도 존재 이유
    • 다른 데이터베이스 엔진 간의 호환성 최대화
    • 정적이고 엄격한 타입을 사용하는 데이터베이스의 SQL 문을 SQLite에서도 작동하도록 하기 위함이다.

⭐️ Costraints

입력하는 자료에 대해 제약을 정하고, 제약에 맞지 않다면 입력을 거부할 수 있다.
사용자가 원하는 조건의 데이터만 유지하기 위해 즉, 데이터의 무결성을 유지하기 위해 테이블의 특정 컬럼에 제약을 설정하는 방법에 대해 알아보자 !

데이터 무결성이란?

  • 데이터 베이스 내의 데이터에 대한 정확성, 일관성을 보장하기 위해 데이터 변경 혹은 수정 시 여러 제한을 두어 데이터의 정확성을 보증하는 것
    • 무결성이란 데이터의 정확성, 일관성을 나타냄
  • 데이터베이스에 저장된 데이터의 무결성을 보장하고 데이터베이스의 상태를 일관되게 유지하는 것이 목적

Constratints 종류

NOT NULL

  • 컬럼이 NULL 값을 허용하지 않도록 지정
  • 기본적으로 테이블의 모든 컬럼은 NOT NULL 제약 조건을 명시적으로 사용하는 경우를 제외하고는 NULL 값을 허용함

UNIQUE

  • 컬럼의 모든 값이 서로 구별되거나 고유한 값이 되도록 함

PRIMARY KEY

CREATE TABLE table_name (
    id INTEGER PRIMARY KEY
);
  • 테이블에서 행의 고유성을 식별하는데 사용되는 컬럼
  • 각 테이블에는 하나의 기본 키만 있음
  • 암시적으로 NOT NULL 제약 조건이 포함되어 있음

AUTOINCREMENT

CREATE TABLE table_name (
	id INTEGER PRIMARY KEY AUTOINCREMENT,
);
  • 사용되지 않은 값이나 이전에 삭제된 행의 값을 재사용하는 것을 방지
  • INTEGER PRIMARY KEY 다음에 작성하면 해당 rowid 를 다시 재사용하지 못하도록 함
  • Django에서 테이블 생성 시 id 컬럼에 기본적으로 사용하는 제약 조건

⭐️ ALTER TABLE

-- 1. Rename a table
ALTER TABLE table_name RENAME TO new_table_name;

-- 2. Rename a column
ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name;

-- 3. Add a new column to a table
ALTER TABLE table_name ADD COLUMN column_definition;

-- 4. Delete a column
ALTER TABLE table_name DROP COLUMN column_name;

ALTER TABLE RENAME

테이블 명 변경하기

    ALTER TABLE contacts RENAME TO new_contacts;

ALTER TABLE RENAME COLUMN

컬럼명 변경하기

ALTER TABLE new_contacts RENAME COLUMN name TO last_name;

ALTER TABLE ADD COLUMN

새 컬럼 추가하기

ALTER TABLE new_contacts ADD COLUMN address TEXT NOT NULL;

  • 만약 테이블에 기존 데이터가 있을 경우 다음과 같은 에러가 발생
 Cannot add NOT NULL column with default value NULL

  • 이전에 이미 저장된 데이터들은 새롭게 추가되는 컬럼에 값이 없기 때문에 NULL이 작성되는데,
  • 새로 추가되는 컬럼에 NOT NULL 제약조건이 있기 때문에 기본 값 없이는 추가될 수 없다는 에러가 발생한 것이다.
  • 다음과 같이 DEFAULT 제약 조건을 사용하여 해결할 수 있다.
    ALTER TABLE new_contacts
    ADD COLUMN address TEXT NOT NULL DEFAULT 'no address';
  • 이렇게 하면 address 컬럼이 추가되면서 기존에 있던 데이터들의 address 컬럼 값은 no address가 된다.

ALTER TABLE DROP COLUMN

컬럼 삭제하기

  • column을 지우는 것은 sqlite를 터미널에서 직접 켜서 타이핑 해야 작동된다.
    ALTER TABLE new_contacts DROP COLUMN address;

  • 삭제하지 못하는 경우
    • 컬럼이 다른 부분에서 참조되는 경우 (FOREIGN KEY(외래 키) 제약조건에서 사용되는 경우)
    • PRIMARY KEY 인 경우
    • UNIQUE 제약 조건이 있는 경우

⭐️ DROP TABLE

데이터베이스에서 테이블 제거하기

DROP TABLE new_contacts;

DROP TABLE 특징

  • 한 번에 하나의 테이블만 삭제할 수 있다.
  • 여러 테이블을 제거하려면 여러 DROP TABLE 문을 실행해야 한다.
  • DROP TABLE 문은 실행 취소하거나 복구할 수 없으므로 주의해서 실행하여야 한다.
  • 존재하지 않는 테이블을 제거하면 SQLite에서 다음과 같은 오류가 발생한다.
    no such table: table_name

📌 요약

  • DDL을 사용하여 데이터베이스 테이블 구조를 관리하는 방법
-- contacts 테이블 생성하기
CREATE TABLE contacts (
    name TEXT NOT NULL,
    age INTEGER NOT NULL,
    email TEXT NOT NULL UNIQUE
);

-- 테이블 이름 변경하기
ALTER TABLE contacts RENAME TO new_contacts;

-- 컬럼 이름 변경하기
ALTER TABLE new_contacts RENAME COLUMN name TO last_name;

-- 새 컬럼 추가하기
ALTER TABLE new_contacts ADD COLUMN address TEXT NOT NULL;
-- 새 컬럼 추가시 기존데이터 있을 경우 발생하는 오류 방지하기
ALTER TABLE new_contacts 
ADD COLUMN address TEXT NOT NULL DEFAULT 'no address';

-- 컬럼 삭제하기
ALTER TABLE new_contacts DROP COLUMN address;

-- 테이블 삭제하기
-- 제거하면 되돌릴 수 없으므로 조심하자!
DROP TABLE contacts;
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글