[데이터베이스] MySQL 테이블 만들기

휘루·2023년 6월 23일
0

데이터베이스

목록 보기
3/6
post-custom-banner

MySQL 세팅

Port는 3306 고정이고 Username, Hostname Connection Name, Connection Method도 똑같이 합니다.
이렇게 사진대로 세팅을 해줍니다.

Test Connection

  1. 비밀번호가 틀리면 Successfully가 안뜹니다.
  2. MySQL 서버를 켜지 않으면 Successfully가 안뜹니다.

MySQL 시작

메뉴가 많은데 Administration 옆에 있는 Schemas를 누릅니다.

sys가 기본으로 되어 있습니다.
여기서 4번째인 database를 누릅니다.

이름은 아무렇게나 짓고, Charset은 utf8mb4로 설정합니다. utf8mb4가 많이 쓰입니다.
utf8은 한글이나 유니코드를 데이터에 담을 수 있는 거고 mb4는 이모티콘을 담을 수 있습니다.

Apply -> Finish를 눌러줍니다.

그렇게 Finish하면 pool이 만들어지고 안에 내용들이 생깁니다.

Table을 만들어야 하는데 우클릭 누르고 Create Table을 해주면 됩니다.

Charset/Collation은 utf8mb4로 바꾸고
Table Name을 지어주고 Engine은 InnoDB를 씁니다.
이 중에는 MyISAM과 InnoDB를 쓰는데 InnoDB를 주로 많이 씁니다.

datatype 설정

타입 설정이 양이 많은데요.

  • INT : 정수
  • VARCHAR() : 문자열인데 문자열(자릿수)입니다. VARCHAR(10)하면 문자열 10자리입니다.
  • DATETIME : DATE는 날짜만 저장하고, DATETIME은 시간까지 저장합니다.
  • DECIMAL : 고정 소수인데 타입 고정할 때 사용합니다.
  • DOUBLE : 소수인데 조금 길면 DOUBLE을 사용합니다.
  • FLOAT : 소수점인 애들은 FLOAT을 써서 고정 소수점을 만들 수 있습니다.
  • TINYINT() : 정수 데이터 타입으로 0 - 255까지 사용할 수 있습니다.
  • CHAR() : 캐릭터를 뜻하는데 CHAR(10)이면 딱 10자리만 쓰는 걸 뜻합니다. VARCHAR를 더 씁니다.
  • JSON :
  • TEXT : 길이가 엄청 긴(자기소개서 같은) 게시글에 쓸 때 자료형으로 사용합니다.
  • BOOLEAN : 숫자 0, 1로 표현한 건데 1은 True, 0은 False로 사용합니다.

이정도만 알면 됩니다. MySQL의 버전에 따라 없는 자료형도 있습니다.

PK : id옆에 노란게 있는데 primary key를 의미합니다.
NN : Not Null인데 Null은 빈칸을 의미합니다. Not Null은 빈칸이 아니다라는 의미이며 값이 필수라는 걸 의미합니다.
UQ : id에 Unique를 사용하는데요. 고유 색인, 고유 제한을 의미합니다. 반복값 삽입을 방지합니다.
B : B는 Binary인데 010101로 데이터 표현하는 걸 말합니다.
UN : Unsigned를 뜻하는데 체크하면 음수도 저장할 수 있게 됩니다. 음수가 필요 없다면 체크 하는게 좋죠.
ZF : 모르겠습니다. 사용 잘 안한다고 합니다.
AI : Auto Increment는 아이디를 매길 때 role테이블에 데이터를 넣는 상황이면 그 때마다 아이디를 직접 안넣고 자동적으로 넣어줍니다. data의 아이디를 1, 2, 3처럼 자동으로 넣습니다.
단점은 UUID, Nano ID처럼 문자열이면 AI가 필요 없고, 숫자를 연달아 넣을 때 문제가 생긴다고 합니다.
G : Generated는 다른 Column에 의존하는 Column인데 Column A와 G Column B가 있으면 B를 A * 2로 설정할 경우 A에 2를 넣을 때 B는 2로 저장되는 자동 의존형 값입니다.

role 테이블 만들기

그리고 Column Name에 각각 Comment를 넣어줄 수 있습니다.
id에 직책아이디, name에 직책이름, min_salary에 최저연봉을 넣도록 하겠습니다.

그렇게 설정을 아래의 사진처럼 해주면

Apply를 눌러줍니다.

이렇게 SQL을 만들어줍니다.

이제 이거 그대로 외우면 됩니다.

CREATE TABLE `role` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, // id는 데이터타입 자료형, 양수, 자동 번호 매기기
`name` VARCHAR(10) NOT NULL,
`min_salary` INT UNSIGNED NOT NULL DEFAULT 2500,
PRIMARY KEY (`id`),
UNIQUE INDEX `name_UNIQUE` (`name` DESC) VISIBLE, // ASC는 오름차순, DESC는 내림차순
INIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COMMENT = `직책 테이블`;

id (키)
INT(11) : 데이터타입 자료형 / UNSIGNED : 0, 양수만 사용 / NOT NULL : 필수 / AUTO_INCREMENT는 자동으로 번호 매겨주기

name (이름)
VARCHAR(10) : 10글자까지 사용 / NOT NULL : 빈칸이 없어야 할 때, 필수

min_salary (최저연봉)
INT : / UNSIGNED : 0, 양수 / NOT NULL : 필수 / DEFAULT 2500 : 값을 안넣으면 기본 2500

UNIQUE INDEX : 고유하다는 건데 고유한 값을 색인으로 인덱스를 만들어 둡니다.
name_UNIQUE를 UNIQUE INDEX 해줍니다.
id_UNIUQE도 UNIQUE INDEX 해줍니다.
VISIBLE은 작동하는 INDEX를 의미합니다.

('name' DESC(내림차순)) VISIBLE,
이름을 내림차순하고 작동할 때 보이는 걸 뜻합니다.

사원 테이블 만들기

id, name, email, salary, team, quit_date, created_at을 만들어 줍니다.

created_at은 회원가입 날짜를 말하는데 Default/Expression에 NOW()를 적으면 날짜를 알 수 있습니다.
또는 CURRENT_TIMESTAMP로 넣어줄 수도 있습니다.

외래키 만들기

role_id를 새로 만들어줍니다. NN, UN을 추가해줍니다.

그리고 Foreign Keys로 들어갑니다.

이름을 employ_role_fk로 지어주고 옆에는 role로 연결합니다.
우측 칸에 Column은 role_id로 연결합니다.

On Update, On Delete

그리고 알아가야 할 부분이 있는데요.

NO ACTION으로 되어 있는데 NO ACTION은 다른 곳에서 FOREIGN KEY를 참조해서 수정하려고 해도 못바꿉니다. RESTRICT도 마찬가지로 못바꿉니다.
ID는 웬만하면 바꾸지 말라 했었죠. 그래서 에러나기 위한 옵션입니다.
자식이 참조하는 게 없으면 바꿔도 됩니다.

부모의 ID와 자식의 ID를 모두 6을 바꾸고 싶으면 내용을 바꾸고 CASCADE를 하면 됩니다.
참조하고 있는 외래키들 전부 바꿀 때 쓰는 옵션입니다. On Update에서 CASCADE가장 많이 쓰는 옵션입니다.

일부 직책인 1키만 지우고 싶을 때

만 지우는 건 SET NULL입니다.

CASCADE의 경우는 저 영역이 통째로 지워질 수 있습니다.

그럼 데이터베이스 정리하다가 대참사가 일어나게 되겠죠.
그래서 On Delete에서는 CASCADE 잘 안쓰고 SET NULL을 씁니다.

아니면 On Update, On Delete 둘 다 안전하게 NO ACTION을 씁니다.
그렇게 Apply를 하기전에 값을 가져오면 이렇게 됩니다.

CREATE TABLE `pool`.`employ` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `email` VARCHAR(100) NOT NULL,
  `salary` INT UNSIGNED NOT NULL,
  `team` VARCHAR(20) NOT NULL,
  `quit_date` DATE NULL,
  `created_at` DATETIME NULL DEFAULT NOW(),
  `role_id` INT UNSIGNED NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `email_UNIQUE` (`email` ASC) INVISIBLE,
  INDEX `employ_role_fk_idx` (`role_id` ASC) VISIBLE,
  CONSTRAINT `employ_role_fk`
    FOREIGN KEY (`role_id`)
    REFERENCES `pool`.`role_name` (`id`)
    ON DELETE SET NULL
    ON UPDATE CASCADE
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COMMENT = '사원 테이블';

INDEX 'employ_role_fk_idx'는 외래키입니다. 외래키는 INDEX가 자동으로 걸립니다.

CONSTRAINT는 제약이라는 의미인데
FOREIGN KEY('role_id')를 , REFERENCES(참조하다)는 의미인데요.

제약이 걸려서 키를 보호해주는 역할을 한다는 내용입니다.
삭제할 때는 SET NULL, 업데이트 할때는 CASCADE로 업데이트합니다.

role 안에 데이터 넣기

role 안에 데이터를 넣을 건데 저 빨간색 친 테이블을 눌러줍니다.

그러면 창이 뜨는데

연봉 테이블을 작성하고 Apply를 눌러줍니다.

이렇게 작성이 되는데 이걸 SQL이라 합니다. 이걸 세분화 할 수도 있습니다.
또한 이 SQL을 줄일 수도 있습니다.

SQL을 줄이면

이렇게도 줄이는 방법이 있습니다.

세분화 테이블입니다.

그렇게 Apply를 하면

id가 자동으로 1, 2, 3, 4, 5가 매겨진 걸 보실 수 있습니다.

employ 테이블

이제 employ의 테이블을 넣도록 하겠습니다.

만약 테이블 내용을 다시 Null로 돌리고 싶다면 SEt Field to NULL을 누르면 됩니다.

role_id를 6으로 정하고 넣어보도록 하겠습니다.
6을 넣으면 에러가 나와야 정상입니다.


이렇게 에러가 나오는데 FOREIGN KEY가 6이 없는데 왜 6을 넣느냐? 안된다 라는 의미입니다.
6 대신 1을 넣어보도록 하겠습니다.

role_id는 1이 잘 돌어가집니다. 근데 id가 카운팅되서 3으로 되어버렸는데
테이블 설정에서 바꾸도록 하겠습니다.

Auto Increment를 수정해주고 Apply 해주면 됩니다.

profile
반가워요
post-custom-banner

0개의 댓글