참조
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에선 불가)
일단 company라는 database를 만들어준다
이때 database는 테이블이 아닌
약간 '사용자' 같은 느낌으로 보면 된다
한 database 아래에 여러개의 테이블이 있을수있다.
company란 database 를 사용하기 위해
use company
를 입력해준다
changed 완
이러한 회사 테이블을 만드려고 한다
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 이런식으로 번호를 붙여서 넣는경우가 많다
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.
처럼 보고 뭐가 잘못됐는지 한눈에 알기 쉽다
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보다 먼저인지 체크
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를 삭제하려할시
다른 테이블에서 참조하고 있다고 하면서 안된다.
이처럼 한번 만든 테이블은 수정하기도 삭제하기도 복잡하기때문에
처음 테이블을 만들때 부터 미리 생각을 정말 잘 잘 잘 해서 수정 없이 그대로 쭉가는게 좋다
나중에 수정하려면 복잡하므로
처음부터 시간을 오래 써서 잘 짜는게
결국 나중에 시간을 더 아끼게 된다.
테이블 생성 수정 삭제 끝