TIL | Database DDL

전준영·2022년 8월 15일
0

TIL

목록 보기
6/10
post-thumbnail

📌 DDL이란..

DDL은 Data Define Language의 약자로 스키마 내의 객체를 정의하고 관리할때

사용되는 쿼리문을 의미합니다. CREATE, ALTER, DROP 이 대표적인 DDL입니다.

1. 스키마 생성

먼저 mysql 서버에 접속해야한다. $mysql -u root -p 라는 명령어로 mysql 서버에 접속한다.

그리고 나서 myql> show databases; 를 입력하면 현재 mysql상의 데이터베이스들이 나온다.

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

어떤 데이터가 있는지 확인 후 mysql> CREATE DATABASE justgram; 명령어로 스키마 생성 후

다시 myql> show databases; 를 입력하면 아래와 같이 나타난다.

mysql> create database justgram;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| justgram           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

그리고 나서 justgram이라는 스키마를 사용하겠다.라는 명령어인 mysql> use justgram; 을 입력하면

데이터베이스가 바뀌었다는 안내문이 나오고 mysql> show tables;를 입력하면

아무 테이블도 작성하지 않았기 때문에 Empty set 이라는 문구가 출력된다.

mysql> use justgram;
Database changed
mysql> show tables;
Empty set (0.00 sec)

2. 테이블 생성

테이블 생성은 CREATE TABLE 명령어로 생성할 수 있다.

1. users 테이블 생성
mysql> create table users
    -> (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> email VARCHAR(100) unique NOT NULL,
    -> nickname VARCHAR(50),
    -> password VARCHAR(300) NOT NULL,
    -> profile_image VARCHAR(3000),
    -> created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    -> PRIMARY KEY (id));
Query OK, 0 rows affected (0.03 sec)

id 값은 정수 INT로 지정, PRIMARY KEY 로 기본값을 지정하고 데이터가 증가할 때마다 자동으로 증가하게

AUTO_INCREMENT를 설정해준다. 그리고 로그인할 때의 아이디 개념으로 쓰이는 email은 중복되면

안되기 때문에 UNIQUE 설정을 해준다. VARCHAR는 문자가 들어간다는 의미이고 (100)은 100글자 제한을

둔다는 의미이다. created_at 은 생성된 날짜와 시간을 보여주며 TIMESTAMP를 사용하고

TIMESTAMP는 타임존에 영향을 받기 때문에 time_zone 시스템 변수에 입력된 시간대 정보를 기반

으로 데이터를 입력받아 그 정보를 UTC로 변환하여 저장한다.

작성 후 잘 작성 되었는지 확인하기 위해 SHOW tables; DESC users; 명령어를 입력해보면

mysql> show tables;
+--------------------+
| Tables_in_justgram |
+--------------------+
| users              |
+--------------------+
1 row in set (0.00 sec)

mysql> desc users;
+---------------+---------------+------+-----+-------------------+-------------------+
| Field         | Type          | Null | Key | Default           | Extra             |
+---------------+---------------+------+-----+-------------------+-------------------+
| id            | int           | NO   | PRI | NULL              | auto_increment    |
| email         | varchar(100)  | NO   | UNI | NULL              |                   |
| nickname      | varchar(50)   | YES  |     | NULL              |                   |
| password      | varchar(300)  | NO   |     | NULL              |                   |
| profile_image | varchar(3000) | YES  |     | NULL              |                   |
| created_at    | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+---------------+---------------+------+-----+-------------------+-------------------+
6 rows in set (0.01 sec)

위와 같이 잘 생성이 된 것을 볼 수 있다.

출처: https://thisisprogrammingworld.tistory.com/133 TIMESTAMP 일부 발췌

2. postings 테이블 생성 및 수정
create table postings
    -> (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> user_id INT NOT NULL,
    -> contents VARCHAR(2000) NULL,
    -> created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    -> PRIMARY KEY(id));

postings의 테이블도 마찬가지로 생성해 주었다... 하지만 위에서 하나를 빼놓은 것이 있다.

바로 user_id는 users테이블의 id값을 참조하는데 참조한다는 명령어를 빼먹은 것이다...😅

그래서 수정하는 명령어를 다시 입력해주었다.

alter table postings add foreign key (user_id) references users(id);

이렇게 ALTER TABLE (테이블명) (변경명령어) 로 해결해주었다.

그리고 나서 postings의 테이블을 다시 확인해보면

mysql> desc postings;
+------------+---------------+------+-----+-------------------+-------------------+
| Field      | Type          | Null | Key | Default           | Extra             |
+------------+---------------+------+-----+-------------------+-------------------+
| id         | int           | NO   | PRI | NULL              | auto_increment    |
| user_id    | int           | NO   | MUL | NULL              |                   |
| contents   | varchar(2000) | YES  |     | NULL              |                   |
| created_at | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+---------------+------+-----+-------------------+-------------------+
4 rows in set (0.00 sec)

user_id 열에 Key 부분을 보면 MUL이라고 여러개를 참조할 수 있다는 뜻이다.

참고로 desc는 description의 약자이다.

위와 같은 방식으로 posting_images 테이블과 comments 테이블을 생성해주었다.

3. posting_images 테이블 생성
mysql> desc posting_images;
+------------+---------------+------+-----+-------------------+-------------------+
| Field      | Type          | Null | Key | Default           | Extra             |
+------------+---------------+------+-----+-------------------+-------------------+
| id         | int           | NO   | PRI | NULL              | auto_increment    |
| posting_id | int           | NO   | MUL | NULL              |                   |
| image_url  | varchar(3000) | YES  |     | NULL              |                   |
| created_at | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+---------------+------+-----+-------------------+-------------------+
4 rows in set (0.00 sec)
4. comments 테이블 생성 및 수정
 desc comments;
+------------+---------------+------+-----+-------------------+-------------------+
| Field      | Type          | Null | Key | Default           | Extra             |
+------------+---------------+------+-----+-------------------+-------------------+
| id         | int           | NO   | PRI | NULL              | auto_increment    |
| coment     | varchar(2000) | YES  |     | NULL              |                   |
| posting_id | int           | NO   | MUL | NULL              |                   |
| user_id    | int           | NO   | MUL | NULL              |                   |
| created_at | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+---------------+------+-----+-------------------+-------------------+
5 rows in set (0.00 sec)

다만 comment 테이블을 작성하며 comment 열이 coment로 오타가 나서 또 수정을 해주었다.

마찬가지로 ALTER TABLE (테이블명) (변경명령어) 로 해결해주었고

alter table comments CHANGE coment comment VARCHAR(2000);

변경 후

desc comments;
+------------+---------------+------+-----+-------------------+-------------------+
| Field      | Type          | Null | Key | Default           | Extra             |
+------------+---------------+------+-----+-------------------+-------------------+
| id         | int           | NO   | PRI | NULL              | auto_increment    |
| comment    | varchar(2000) | YES  |     | NULL              |                   |
| posting_id | int           | NO   | MUL | NULL              |                   |
| user_id    | int           | NO   | MUL | NULL              |                   |
| created_at | timestamp     | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+---------------+------+-----+-------------------+-------------------+
5 rows in set (0.00 sec)

보다시피 comment 로 잘 변경이 되었다..!!

✔ 블로그 작성하면서 생략 또는 쓰지않은 명령어

데이터베이스 삭제 명령어

  • DROP database 데이터베이스명

    drop database justgram; 미리 만들어 두었던 데이터 베이스를 삭제하느라 사용했다.

열(column) 추가 명령어

  • ALTER TABLE 테이블명(users) 행위(ADD) 열이름(age) 자료형(INT) 제약조건(NOT NULL)

열(column) 삭제 명령어

  • ALTER TABLE 테이블명(users) 행위(DROP) 열이름(profile_image)

열(column) 수정 명령어

  • ALTER TABLE 테이블명(posts) 행위(MODIFY) 열이름(content) 자료형(TEXT) 제약조건(NULL)

Table 삭제

  • DROP TABLE 테이블명

DROP TABLE 을 사용할 경우 테이블 객체안에 포함된 모든 데이터도 함께 삭제된다!

특정 행 만을 삭제하고 싶다면

  • DELETE FROM posts WHERE content

DELETE FROM 명령어 뒤에 테이블과 WHERE(if문과 같은 역할) content 이런식으로 삭제 할 수 있지만

DELETE 명령은 행(row) 단위로 내부적으로 처리하기 때문에 처리속도가 늦어진다는 단점이 있다.

테스트 데이터들이 있어 테이블안의 데이터를 모두 삭제해야 하는 경우에는

TRUNCATE TABLE 명령어를 사용하면 된다.

  • TRUNCATE TABLE posts
profile
Just do it!

0개의 댓글

관련 채용 정보