DDL은 Data Define Language의 약자로 스키마 내의 객체를 정의하고 관리할때
사용되는 쿼리문을 의미합니다. CREATE, ALTER, DROP 이 대표적인 DDL입니다.
먼저 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)
테이블 생성은 CREATE TABLE
명령어로 생성할 수 있다.
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 일부 발췌
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 테이블을 생성해주었다.
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)
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) 추가 명령어
열(column) 삭제 명령어
열(column) 수정 명령어
Table 삭제
DROP TABLE 을 사용할 경우 테이블 객체안에 포함된 모든 데이터도 함께 삭제된다!
특정 행 만을 삭제하고 싶다면
DELETE FROM 명령어 뒤에 테이블과 WHERE(if문과 같은 역할) content 이런식으로 삭제 할 수 있지만
DELETE 명령은 행(row) 단위로 내부적으로 처리하기 때문에 처리속도가 늦어진다는 단점이 있다.
테스트 데이터들이 있어 테이블안의 데이터를 모두 삭제해야 하는 경우에는
TRUNCATE TABLE 명령어를 사용하면 된다.