DB MYSQL 1 테이블 생성 수정 삭제

문준혁·2023년 11월 28일
0

참조
https://www.youtube.com/watch?v=c8WNbcxkRhY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=3

SQL
Structured Query Language
현업에서 쓰이는 relational DBMS의 표준언어
DDL + DML + VDL

SQL 에서의 relation
중복된 tuple을 허용한다
(relational data model에선 불가)

IT 회사 관련 RDB 만들어보기 (MYSQL)

일단 company라는 database를 만들어준다
이때 database는 테이블이 아닌
약간 '사용자' 같은 느낌으로 보면 된다
한 database 아래에 여러개의 테이블이 있을수있다.


company란 database 를 사용하기 위해

use company

를 입력해준다

changed 완

이러한 회사 테이블을 만드려고 한다

1번

create table department (
id int primary key,
name varchar(20) not null unique,
leader_id int);

id는 int타입 그리고 PK로 지정을하고
name 은 문자 20글자 제한까지
not null 로 이름이 꼭 들어가게
그리고 unique로
중복된 이름이 들어가지 않게 설정한다
만약 이름이 같은사람이 있을경우 sam sam2 이런식으로 번호를 붙여서 넣는경우가 많다


2번

create table employee (
id int primary key,
name varchar(30) not null,
birth_date date,
sex char(1) check (sex in ('M','F')),
position varchar(10),
salary int default 50000000,
dept_id int,
foreign key (dept_id) references department(id) on delete set null on update cascade,
constraint salary_under check (salary >= 50000000));

birth_date 를 date 타입으로
sex의 경우는 M,F이면 데이터가 입력되지만
M,F가 아닐경우 데이터가 들어가지 않는다

salary값을 입력하지 않을경우 기본으로 50000000이 들어간다

dept_id의 경우 department의 id에 없는 값일경우 들어가지 않는다 (foreign key)
이때 on delete의 경우
참조하는 값이 삭제될경우
set null 즉 null로 변경된다는 의미

on update 는 참조하는값이 수정될경우
cascade 그대로 같이 수정된다는 의미

이떄 on delete 뒤에 restrict도 있는데
이경우 참조값의 변경,삭제를 금지한다

check (salary ... ) 의 경우
50000000 미만의 값을 넣으려할시 데이터 입력이 안된다.

그리고 constraint 의 이름을 정해줄수 있는데
이름을 정하지 않을시
나중에 입력 오류가 나도 한번에 알아보기 힘들수있어서
constraint의 이름을 정할수있다
이름을 정하지 않고 salary를 50000000 미만으로 넣을시

Check constraint 'EMPLOYEE_chk_2' is violated.

처럼 나오는데 이경우 뭘 잘못했는지 한눈에 알기가힘들다

이떄 constraint 의 이름을 넣게되면

Check constraint 'salary_under' is violated.

처럼 보고 뭐가 잘못됐는지 한눈에 알기 쉽다


3번

create table project (
id int primary key,
name varchar(20) not null unique,
leader_id int,
start_date date,
end_date date,
foreign key (leader_id) references employee(id) on delete set null on update cascade,
check (start_date < end_date)
);

leader_id 를 employee id를 참조하게끔,
참조하는 값 삭제시 null, 수정시 따라가게
start_date가 end_date보다 먼저인지 체크


4번

create table works_on (
empl_id int,
proj_id int,
primary key (empl_id, proj_id),
foreign key (empl_id) references employee(id) on delete cascade on update cascade,
foreign key (proj_id) references project(id) on delete cascade on update cascade
);

전부 잘 생성 되었다.


테이블 수정

1번을 만들땐 2번의 employee 가 없었기 때문에 leader_id에 foreign key를 걸어줄수가 없었다

이제 다 만들었으니 table을 수정해보자

alter table department add foreign key (leader_id) references employee(id)
on update cascade on delete set null;

alter table <테이블이름> ~~ 으로 수정 가능하다


테이블 삭제

drop table <테이블이름>;

이때 foreign key 같은 참조관계가 있을경우 테이블이 삭제 안된다.
ex) employee 를 삭제하려하면

mysql> drop table employee;
Error Code: 3730. Cannot drop table 'employee' referenced by a foreign key constraint 'project_ibfk_1' on table 'project'.

project 에서 참조하고 있다고하면서 삭제가 안된다

다만 이건 참조하는곳이 전부다 나오는게 아닌

하나만 보여주기 때문에

저 project를 삭제하고 다시 employee를 삭제하려할시

다른 테이블에서 참조하고 있다고 하면서 안된다.

이처럼 한번 만든 테이블은 수정하기도 삭제하기도 복잡하기때문에

처음 테이블을 만들때 부터 미리 생각을 정말 잘 잘 잘 해서 수정 없이 그대로 쭉가는게 좋다

나중에 수정하려면 복잡하므로

처음부터 시간을 오래 써서 잘 짜는게

결국 나중에 시간을 더 아끼게 된다.


테이블 생성 수정 삭제 끝

profile
이제 시작 개발

0개의 댓글