탐구개발
MySQL 데이터베이스 생성 본문
MySQL 설치가 완료된 후 다음과 같은 순서로 새로운 데이터베이스를 구축하겠습니다
- 새 데이터베이스 생성
- 사용자 생성 및 권한부여
- 테이블 생성
1. 새 데이터베이스 생성
Docker 컨테이너에서 MySQL 콘솔에 접속합니다.
mysql -u root
새로운 데이터베이스를 생성합니다.
CREATE DATABASE {DB이름} default CHARACTER SET UTF8;
생성된 데이터베이스를 확인합니다.
show databases;
실제 실행화면입니다.
root@963aee83dd50:/# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.22 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.09 sec)
mysql> CREATE DATABASE somoim_db default CHARACTER SET UTF8;
Query OK, 1 row affected, 1 warning (0.06 sec)
2. 사용자 생성 및 권한부여
데이터베이스를 사용할 사용자를 생성합니다.
CREATE USER {사용자명}@localhost IDENTIFIED BY '{비밀번호}';
새로 생성한 사용자에게 권한을 부여합니다.
GRANT ALL PRIVILEGES ON {데이터베이스명}.* TO {사용자명}@localhost;
새로운 설정을 즉시 반영합니다.
FLUSH PRIVILEGES;
현재 root 계정으로 사용 중인 콘솔을 종료하고 새로운 사용자계정으로 로그인하겠습니다.
EXIT;
mysql -u study_user -p
실제 실행화면입니다.
mysql> CREATE USER somoim_user2@localhost IDENTIFIED BY 'somoim';
Query OK, 0 rows affected (0.07 sec)
mysql> GRANT ALL PRIVILEGES ON somoim_db.* TO somoim_user2@localhost;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
mysql> EXIT;
Bye
root@963aee83dd50:/# mysql -u somoim_user2 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.22 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
3. 테이블 생성
데이터베이스를 선택합니다.
USE {데이터베이스명};
테이블을 생성합니다.
CREATE TABLE `테이블명` (
`칼럼명` 컬럼타입(길이) NULL여부 DEFAULT값 COMMENT값
PRIMARY KEY (컬럼명);
);
실제 실행화면입니다.
mysql> use somoim_db
Database changed
CREATE TABLE `tb_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(10) NOT NULL,
`reg_dt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`chg_dt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
INT
int는 정수 값을 저장하는 데 사용되는 데이터 타입입니다.
길이를 지정해주지 않으면 디폴트 11로 잡힙니다. int 최대 자리 수는 10이지만 음수표현을 위해 1이 추가되었습니다.
범위는 signed, unsigned에 따라 다릅니다. MySQL에서는 signed int는 -2147483648 ~ 2147483647, unsigned int는 0 ~ 4294967295 값을 가집니다.
NOT NULL과 DEFAULT
not null은 사용자가 아무것도 입력하지 않거나 null을 직접 입력하게 되었을 경우 에러를 발생시킵니다.
default는 사용자가 아무것도 입력하지 않았을 때만 활성화되며 null을 입력하면 활성화되지 않습니다.
DATETIME과 TIMESTAMP
datetime과 timestamp는 둘 다 날짜와 시간을 나타내는 데이터 타입이지만 다음과 같은 차이점이 있습니다.
datetime timestamp 타입 문자형 숫자형 용량 8byte 4byte 범위 1000-01-01 00:00:00~ 9999-12-31 23:59:59 1970-01-01 00:00;01~ 2038-01-19 03:14:07 UTC기본값 없음
직접 입력해주거나
default current_timestamp 추가 필요자동으로 현재 날짜 저장
CHAR, VARCHAR
모두 문자열 데이터를 저장하는 데 사용되는 데이터 타입이지만 다음과 같은 차이점이 있습니다.
char는 고정 길이로 지정된 길이만큼의 공간을 항상 할당합니다. 이런 특성으로 인해 문자의 길이가 일정할 경우(특히 1자리일 경우) 저장공간의 절약이 가능합니다. 또한 검색과 정렬이 효율적이기 때문에 데이터 변경이 빈번할 경우 좋습니다. 하지만 문자의 길이가 일정하지 않을 경우에는 오히려 저장공간의 낭비로 이어질 수 있습니다. 또 남는 길이만큼 공백을 입력하게 되는데 이 공백 때문에 인덱스 적용이 되지않아 쿼리 성능저하로 이어질 수 있습니다.
varchar는 가변 길이로 필요한 만큼의 공간을 할당하며, 저장된 문자열의 실제 길이만큼만 공간을 할당합니다. 문자의 길이가 일정하지 않을 경우 저장공간의 절약이 가능합니다.
'프로젝트' 카테고리의 다른 글
IntelliJ GitHub 연동없이 로컬 Git Repository 설정 (0) | 2023.11.09 |
---|---|
IntelliJ에서 Spring Boot 프로젝트 JAR 생성하기 (0) | 2023.11.09 |
H2와 JPA를 활용한 테스트 코드 작성 (0) | 2023.11.08 |
Spring Boot 프로젝트 생성 (IntelliJ) (2) | 2023.11.08 |
Docker MySQL 컨테이너 생성 (0) | 2023.11.08 |