코드코코

210917 [7장] 7.4 데이터베이스 및 테이블 생성하기 본문

기록/node.js 교과서 따라하기

210917 [7장] 7.4 데이터베이스 및 테이블 생성하기

코드코코 2021. 9. 17. 19:13

//데이터베이스 생성명령
//CREATE SCHEMA [데이터베이스명];
//DEFAULT CHARACTER SET utf8 : 한글을 사용할 수 있게 함.
mysql> CREATE SCHEMA `nodejs` DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

//데이터베이스 사용명령
//USE [데이터베이스명];  
mysql> USE nodejs
Database changed

//테이블생성
//CREATE TABLE [데이터베이스명.테이블명];
//CREATE TABLE nodejs.users : nodejs 데이터베이스매에 users 테이블 생성을 의미.
mysql> CREATE TABLE nodejs.users (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(20) NOT NULL,
    -> age INT UNSIGNED NOT NULL,
    -> married TINYINT NOT NULL,
    -> comment TEXT NULL,
    -> created_at DATETIME NOT NULL DEFAULT now(),
    -> PRIMARY KEY(id),
    -> UNIQUE INDEX name_UNIQUE (name ASC))
    -> COMMENT = '사용자정보'
    -> DEFAULT CHARACTER SET = utf8
    -> ENGINE = InnoDB;
Query OK, 0 rows affected (0.01 sec)

//column(세로줄),row(가로줄)
//field : 세로줄과 가로줄이 교차하는 칸 

*자료형
1. INT : -2147483648~2147483647까지의 정수 (소수까지저장:FLOAT 혹은 DOUBLE)
2. VARCHAR(자릿수) : 가변길이
3. CHAR(자릿수) : 반드시 자릿수 만큼 문자열이 들어감(짧다면 스페이스가 채워짐)
4. TEXT : 긴 글을 저장할 때, 보통 수백자 보다 길 때
5. TINYINT : -128~127까지의 정수.
6. DATETIME : 날짜와 시간 정보.
7. DATE : 날짜정보
8. TIME : 시간정보

*옵션
1. NULL, NOT NULL : 빈칸 허용 여부.
2. AUTO_INCREMENT : 자동 숫자 부여
3. UNSIGNED : 숫자 자료형에 적용되는 옵션. 음수는 무시되고 0부터 저장.
4. ZEROFILL : 숫자의 자리수가 고정되어 있을 때 사용. 비어 있는 자리에 모두 0을 넣음. ex)0001
5. DEFAULT : 값이 없다면 mySQL이 기본값을 대신 넣음.
6. now(): 현재 시각.
7. PRIMARY KEY : 기본키, 로우를 대표하는 고유한 값.
8. UNIQUE INDEX : 해당값이 고유해야 하는지에 대한 옵션.  
 - UNIQUE INDEX name_UNIQUE (name ASC) : 네임컬럼을 오름차순으로 기억.
 - PRIMARY KEY 나 UNIQUE INDEX 는 데이터베이스가 별도롬 컴럼을 관리 조회하므로 조회 시 속도가 빠름.

*테이블 자체에 대한 설정
1. COMMENT : 테이블에 대한 보충설명. 필수는 아님.
2. DEFAULT CHARACTER SET utf8 : 설정하지 않으면 한글이 입력이 안됨. 반드시 설정.
3. ENGINE : MYISAM과 InnoDB 가 가장 많이 쓰임.

//테이블 확인
//DESC [테이블명];
mysql> DESC users;
+------------+------------------+------+-----+---------------------+----------------+
| Field      | Type             | Null | Key | Default             | Extra          |
+------------+------------------+------+-----+---------------------+----------------+
| id         | int(11)          | NO   | PRI | NULL                | auto_increment |
| name       | varchar(20)      | NO   | UNI | NULL                |                |
| age        | int(10) unsigned | NO   |     | NULL                |                |
| married    | tinyint(4)       | NO   |     | NULL                |                |
| comment    | text             | YES  |     | NULL                |                |
| created_at | datetime         | NO   |     | current_timestamp() |                |
+------------+------------------+------+-----+---------------------+----------------+
6 rows in set (0.02 sec)

//테이블 삭제
//DROP TABLE [테이블명];
mysql> drop table users;
Query OK, 0 rows affected (0.02 sec)

//사용자의 댓글을 저장하는 테이블 생성
mysql> CREATE TABLE nodejs.comments(
    -> id INT NOT NULL AUTO_INCREMENT,
    -> commenter INT NOT NULL,
    -> comment VARCHAR(100) NOT NULL,
    -> created_at DATETIME NOT NULL DEFAULT now(),
    -> PRIMARY KEY(id),
    -> INDEX commenter_idx (commenter ASC),
    -> CONSTRAINT commenter
    -> FOREIGN KEY (commenter)
    -> REFERENCES nodejs.users (id)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE)
    -> COMMENT = '댓글'
    -> DEFAULT CHARSET=utf8mb4
    -> ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)

*옵션
1. 외래키 : 다른 테이블의 기본키를 저장하는 칼럼.
 - CONSTRAINT [제약조건명] FOREIGN KEY [칼럼명] REFERENCES[참고하는 칼럼명];
2. ON UPDATE CASCADE, ON DELETE CASCADE : 사용자 정보가 수정되거나 삭제되면 연결된 댓글정보도 같이 수정하거나 삭제.
 -데이터 불일치 현상 방지

//테이블명 확인
 mysql> SHOW tables;
+------------------+
| Tables_in_nodejs |
+------------------+
| comments         |
| users               |
+------------------+
2 rows in set (0.00 sec)