프로젝트 DB연결 전 테이블 만들어보기

wltjd1688·2025년 2월 26일

풀사이클

목록 보기
24/74

이전에 만든 ERD를 기준으로 프로젝트를 DB에 연결하여 만들려고 한다.

SQL은 외우는게 아니다!
필요할 때 마다 구글링 해야한다

  1. 'board'스키마 생성

    $ docker exec -it mariadb /bin/bash
    $ mariadb -u root -p
    Enter password: #기존에 root로 설정해뒀기에 그대로 입력
    MariaDB [(none)]> CREATE DATABASES Borad
    MariaDB [(none)]> USE Board
  2. 사용자 테이블 생성

    MariaDB [Board]> CREATE TABLE users(
    	-> id INT NOT NULL AUTO_INCREMENT,
    	-> name VARCHAR(30) NOT NULL,
    	-> job VARCHAR(100),
    	-> birth DATE,
    	-> PRIMARY KEY (id)
    	-> );
    Query OK, 0 rows affected (0.007 sec)
    
    MariaDB [Board]> SHOW TABLES
    -> ;
    +-----------------+
    | Tables_in_Board |
    +-----------------+
    | users           |
    +-----------------+
    1 row in set (0.001 sec)
    
    MariaDB [Board]> DESC users;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(30)  | NO   |     | NULL    |                |
    | job   | varchar(100) | YES  |     | NULL    |                |
    | birth | date         | YES  |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    4 rows in set (0.001 sec)
  3. 사용자 데이터 삽입

    MariaDB [Board]> INSERT INTO users (name,job, birth)
    -> VALUES("gongu", "actor", "800123");
    Query OK, 1 row affected (0.003 sec)
    
    MariaDB [Board]> SELECT * FROM users;
    +----+-------+-------+------------+
    | id | name  | job   | birth      |
    +----+-------+-------+------------+
    |  1 | gongu | actor | 1980-01-23 |
    +----+-------+-------+------------+
    1 row in set (0.001 sec)
    
    MariaDB [Board]> INSERT INTO users (name, job, birth) VALUES("kim","student","100101");
    Query OK, 1 row affected (0.002 sec)
    
    MariaDB [Board]> INSERT INTO users (name, job, birth) VALUES("lee","teacher","1930-01-02");
    Query OK, 1 row affected (0.001 sec)
    
    MariaDB [Board]> SELECT * FROM users;
    +----+-------+---------+------------+
    | id | name  | job     | birth      |
    +----+-------+---------+------------+
    |  1 | gongu | actor   | 1980-01-23 |
    |  2 | kim   | student | 2010-01-01 |
    |  3 | lee   | teacher | 1930-01-02 |
    +----+-------+---------+------------+
    3 rows in set (0.001 sec)
  4. 게시글 테이블 생성

    MariaDB [Board]> CREATE TABLE posts(
        -> id INT NOT NULL AUTO_INCREMENT,
        -> title VARCHAR(100) NOT NULL,
        -> content VARCHAR(2000),
        -> create_at TIMESTAMP DEFAULT NOW(),
        -> PRIMARY KEY (id)
        -> );
    Query OK, 0 rows affected (0.006 sec)
    
    MariaDB [Board]> DESC posts;
    +-----------+---------------+------+-----+---------------------+----------------+
    | Field     | Type          | Null | Key | Default             | Extra          |
    +-----------+---------------+------+-----+---------------------+----------------+
    | id        | int(11)       | NO   | PRI | NULL                | auto_increment |
    | title     | varchar(100)  | NO   |     | NULL                |                |
    | content   | varchar(2000) | YES  |     | NULL                |                |
    | create_at | timestamp     | YES  |     | current_timestamp() |                |
    +-----------+---------------+------+-----+---------------------+----------------+
    4 rows in set (0.002 sec)
  5. 게시글 데이터 삽입

    MariaDB [Board]> INSERT INTO posts (title, content) VALUES ("title1", "content");
    Query OK, 1 row affected (0.001 sec)
    
    MariaDB [Board]> SELECT * FROM posts;;
    +----+--------+---------+---------------------+
    | id | title  | content | create_at           |
    +----+--------+---------+---------------------+
    |  1 | title1 | content | 2025-02-26 06:10:00 |
    +----+--------+---------+---------------------+
    1 row in set (0.000 sec)
  6. 게시글 테이블에 수정일자 추가

    ALTER TABLE posts
    ADD COLUMN updated_at DATETIME
    DEFAULT NOW()
    ON UPDATE NOW()
  7. 게시글 테이블 id 2 수정

    MariaDB [Board]> UPDATE posts
      -> SET content = "updated!"
      -> WHERE id = 2;
    Query OK, 1 row affected (0.001 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    MariaDB [Board]> SELECT * FROM posts;;
    +----+--------+----------+---------------------+---------------------+
    | id | title  | content  | create_at           | updated_at          |
    +----+--------+----------+---------------------+---------------------+
    |  1 | title1 | content  | 2025-02-26 06:10:00 | 2025-02-26 06:47:52 |
    |  2 | title2 | updated! | 2025-02-26 08:18:06 | 2025-02-26 08:18:06 |
    +----+--------+----------+---------------------+---------------------+
    2 rows in set (0.001 sec)
  8. 게시글 테이블에 작성자 칼럼 FK 추가

    MariaDB [Board]> ALTER TABLE posts
        -> ADD COLUMN user_id INT;
    Query OK, 0 rows affected (0.006 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    MariaDB [Board]> ALTER TABLE posts
        -> ADD FOREIGN KEY(user_id)
        -> REFERENCES users(id);
    Query OK, 2 rows affected (0.007 sec)                      
    Records: 2  Duplicates: 0  Warnings: 0
    
    MariaDB [Board]> DESC posts;
    +------------+---------------+------+-----+---------------------+----------------+
    | Field      | Type          | Null | Key | Default             | Extra          |
    +------------+---------------+------+-----+---------------------+----------------+
    | id         | int(11)       | NO   | PRI | NULL                | auto_increment |
    | title      | varchar(100)  | NO   |     | NULL                |                |
    | content    | varchar(2000) | YES  |     | NULL                |                |
    | create_at  | timestamp     | YES  |     | current_timestamp() |                |
    | updated_at | datetime      | YES  |     | current_timestamp() |                |
    | user_id    | int(11)       | YES  | MUL | NULL                |                |
    +------------+---------------+------+-----+---------------------+----------------+
    6 rows in set (0.002 sec)
    
    MariaDB [Board]> SELECT * FROM posts;;
    +----+--------+----------+---------------------+---------------------+---------+
    | id | title  | content  | create_at           | updated_at          | user_id |
    +----+--------+----------+---------------------+---------------------+---------+
    |  1 | title1 | content  | 2025-02-26 06:10:00 | 2025-02-26 06:47:52 |    NULL |
    |  2 | title2 | updated! | 2025-02-26 08:18:06 | 2025-02-26 08:18:06 |    NULL |
    +----+--------+----------+---------------------+---------------------+---------+
    2 rows in set (0.000 sec)
  9. 조인
    조인에는 LEFT와 RIGHT등등 여러가지가 있지만 보통 LEFT를 자주 쓴다.
    LEFT JOIN을 SELECT - FROM [테이블명] 옆에 작성하는데, 해당 테이블을 왼쪽에 두고 조인한다고 이해하면 된다.

    MariaDB [Board]> SELECT * FROM posts LEFT
        -> JOIN users ON posts.user_id = users.id;
    +----+--------+----------+---------------------+---------------------+---------+------+------+---------+------------+
    | id | title  | content  | create_at           | updated_at          | user_id | id   | name | job     | birth      |
    +----+--------+----------+---------------------+---------------------+---------+------+------+---------+------------+
    |  1 | title1 | content  | 2025-02-26 06:10:00 | 2025-02-26 06:47:52 |    NULL | NULL | NULL | NULL    | NULL       |
    |  2 | title2 | updated! | 2025-02-26 08:18:06 | 2025-02-26 08:18:06 |    NULL | NULL | NULL | NULL    | NULL       |
    |  3 | title3 | content  | 2025-02-26 08:24:44 | 2025-02-26 08:24:44 |    NULL | NULL | NULL | NULL    | NULL       |
    |  5 | title4 | content4 | 2025-02-26 08:26:44 | 2025-02-26 08:26:44 |       3 |    3 | lee  | teacher | 1930-01-02 |
    +----+--------+----------+---------------------+---------------------+---------+------+------+---------+------------+
    4 rows in set (0.001 sec)

    user_id와 user.id가 중복되니까, 해당 컬럼을 빼고 불러온다.

    MariaDB [Board]> SELECT posts.id, title, content, created_at, updated_at, name, job, birth FROM posts LEFT
      -> JOIN users ON posts.user_id = users.id;
    +----+--------+----------+---------------------+---------------------+------+---------+------------+
    | id | title  | content  | created_at          | updated_at          | name | job     | birth      |
    +----+--------+----------+---------------------+---------------------+------+---------+------------+
    |  1 | title1 | content  | 2025-02-26 06:10:00 | 2025-02-26 06:47:52 | NULL | NULL    | NULL       |
    |  2 | title2 | updated! | 2025-02-26 08:18:06 | 2025-02-26 08:18:06 | NULL | NULL    | NULL       |
    |  3 | title3 | content  | 2025-02-26 08:24:44 | 2025-02-26 08:24:44 | NULL | NULL    | NULL       |
    |  5 | title4 | content4 | 2025-02-26 08:26:44 | 2025-02-26 08:26:44 | lee  | teacher | 1930-01-02 |
    +----+--------+----------+---------------------+---------------------+------+---------+------------+
    4 rows in set (0.001 sec)

MariaDB 날짜 / 시간 타입

  • DATE
    • 날짜만(YYYY-MM-DD)
  • DATETIME
    • 날짜 + 시간 (YYYY-MM-DD HH:MM:SS, 24시간제)
  • TIME
    • 시간(HH:MM:SS)
  • TIMESTAMP
    • 보통 create_at과 같은 날짜가 자동으로 찍을 때 사용함,
    • 날짜 + 시간 (YYYY-MM-DD HH:MM:SS, 24시간제, UTC 본초자오선 기준)

NOT NULL VS Default

  • Not Null
    • 직접 null 이라고 작성해도 넣는 것도 안된다.
  • Defualt: 값이 안 들어올 때, 기본 값으로 셋팅
    • 공란으로 insert => Default 설정해둔 기본 값에 insert
    • 직접 null을 입력하면 null이 입력됨
profile
일단 해!!!!

0개의 댓글