RISK IT

[TIL5_23.1.13.] mySQL - DDL 이용하여 데이터베이스 생성, 접근, 변경 본문

IT/TIL

[TIL5_23.1.13.] mySQL - DDL 이용하여 데이터베이스 생성, 접근, 변경

nomoremystery 2023. 1. 14. 01:41
반응형

mySQL 설치
DDL(Data Define Language): 스키마 내의 객체를 정의하고 관리할 때 사용되는 쿼리문
데이터베이스 생성, 접근, 생성, 변경, 삭제 해보기

✍️ 입력

mysql> SHOW DATABASES;

// 초기상태

💻 출력

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

✍️ 입력

mysql> CREATE DATABASE westagram character set utf8mb4 collate utf8mb4_general_ci;

// 옵션으로 character set 설정과 collate 설정을 동시에 해줌

💻 출력

Query OK, 1 row affected (0.01 sec)

✍️ 입력

mysql> SHOW DATABASES;

// 데이터베이스 출력

💻 출력

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westagram          |
+--------------------+
5 rows in set (0.01 sec)

✍️ 입력

mysql> USE westagram;

// westagram 데이터베이스 사용하겠다고 선언

💻 출력

Database changed

✍️ 입력

mysql> SHOW TABLES;

💻 출력

Empty set (0.00 sec)

// 아직 아무 테이블도 존재하지 않음

✍️ 입력

mysql> CREATE TABLE users (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(50) NOT NULL,
    -> email VARCHAR(200) NOT NULL,
    -> profile_image VARCHAR(1000) NULL,
    -> password VARCHAR(200) NOT NULL,
    -> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -> updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
    -> PRIMARY KEY(id)
    -> );

// DDL을 사용하여 users 데이터베이스 생성

💻 출력

Query OK, 0 rows affected (0.01 sec)

✍️ 입력

mysql> SHOW TABLES;

💻 출력

+---------------------+
| Tables_in_westagram |
+---------------------+
| users               |
+---------------------+
1 row in set (0.00 sec)

// 기존에는 없던 users 테이블 출력

✍️ 입력

mysql> DESC users;

// users 테이블에 대한 상세한 description 출력

💻 출력

+---------------+---------------+------+-----+-------------------+-----------------------------+
| Field         | Type          | Null | Key | Default           | Extra                       |
+---------------+---------------+------+-----+-------------------+-----------------------------+
| id            | int           | NO   | PRI | NULL              | auto_increment              |
| name          | varchar(50)   | NO   |     | NULL              |                             |
| email         | varchar(200)  | NO   |     | NULL              |                             |
| profile_image | varchar(1000) | YES  |     | NULL              |                             |
| password      | varchar(200)  | NO   |     | NULL              |                             |
| created_at    | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at    | timestamp     | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+---------------+---------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.01 sec)

✍️ 입력

mysql> CREATE TABLE posts (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> title VARCHAR(100) NOT NULL,
    -> content VARCHAR(3000) NULL,
    -> user_id INT NOT NULL,
    -> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -> updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
    -> PRIMARY KEY(id),
    -> CONSTRAINT posts_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id)
    -> );

// DDL을 사용하여 posts 데이터베이스 생성
// 제약 조건을 사용하여 Foreign Key 생성

💻 출력

Query OK, 0 rows affected (0.02 sec)

✍️ 입력

mysql> SHOW TABLES;

💻 출력

+---------------------+
| Tables_in_westagram |
+---------------------+
| posts               |
| users               |
+---------------------+
2 rows in set (0.00 sec)

✍️ 입력

mysql> DESC posts;

// posts 테이블에 대한 상세한 description 출력

💻 출력

+------------+---------------+------+-----+-------------------+-----------------------------+
| Field      | Type          | Null | Key | Default           | Extra                       |
+------------+---------------+------+-----+-------------------+-----------------------------+
| id         | int           | NO   | PRI | NULL              | auto_increment              |
| title      | varchar(100)  | NO   |     | NULL              |                             |
| content    | varchar(3000) | YES  |     | NULL              |                             |
| user_id    | int           | NO   | MUL | NULL              |                             |
| created_at | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp     | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+------------+---------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

✍️ 입력

mysql> DESC users;

💻 출력

+---------------+---------------+------+-----+-------------------+-----------------------------+
| Field         | Type          | Null | Key | Default           | Extra                       |
+---------------+---------------+------+-----+-------------------+-----------------------------+
| id            | int           | NO   | PRI | NULL              | auto_increment              |
| name          | varchar(50)   | NO   |     | NULL              |                             |
| email         | varchar(200)  | NO   |     | NULL              |                             |
| profile_image | varchar(1000) | YES  |     | NULL              |                             |
| password      | varchar(200)  | NO   |     | NULL              |                             |
| created_at    | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at    | timestamp     | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+---------------+---------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.00 sec)

✍️ 입력

mysql> ALTER TABLE users ADD age INT NOT NULL;

// 기존 user 테이블에 age column 추가

💻 출력

Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> DESC users;

💻 출력

+---------------+---------------+------+-----+-------------------+-----------------------------+
| Field         | Type          | Null | Key | Default           | Extra                       |
+---------------+---------------+------+-----+-------------------+-----------------------------+
| id            | int           | NO   | PRI | NULL              | auto_increment              |
| name          | varchar(50)   | NO   |     | NULL              |                             |
| email         | varchar(200)  | NO   |     | NULL              |                             |
| profile_image | varchar(1000) | YES  |     | NULL              |                             |
| password      | varchar(200)  | NO   |     | NULL              |                             |
| created_at    | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at    | timestamp     | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
| age           | int           | NO   |     | NULL              |                             |
+---------------+---------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.00 sec)

✍️ 입력

mysql> ALTER TABLE users DROP profile_image;

// 기존 users 테이블에 profile_image column 삭제

💻 출력

Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> DESC users;

💻 출력

+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment              |
| name       | varchar(50)  | NO   |     | NULL              |                             |
| email      | varchar(200) | NO   |     | NULL              |                             |
| password   | varchar(200) | NO   |     | NULL              |                             |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp    | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
| age        | int          | NO   |     | NULL              |                             |
+------------+--------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.01 sec)

✍️ 입력

mysql> ALTER TABLE posts MODIFY content TEXT NULL;

// 기존 posts 테이블의 content column을 VARCHAR에서 TEXT 타입으로 변경

💻 출력

Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

✍️ 입력

mysql> DESC posts;

💻 출력

+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment              |
| title      | varchar(100) | NO   |     | NULL              |                             |
| content    | text         | YES  |     | NULL              |                             |
| user_id    | int          | NO   | MUL | NULL              |                             |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED           |
| updated_at | timestamp    | YES  |     | NULL              | on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

테이블을 삭제하는 명령어는
DROP TABLE {table_name};
테이블 객체 내의 모든 데이터(row)를 삭제하는 명령어는
TRUNCATE TABLE {table_name};

반응형