SQL
MySQL 다시보기 02 - 테이블 생성 및 데이터 삽입
H-V
2021. 10. 3. 18:44
유투브 'freeCodeCamp.org' 참조
01 기본 키 & 외래 키란?
1) 기본 키 (PK - Primary Key)
- 한 테이블에서 유일한 값(NULL 제외)을 가진 컬럼 (ID, 사번 등)
- PK 조건은 NULL 값 안됨, 중복값이 절대로 있을 수 없음, PK데이터는 절대로 변하면 안됨
2) 외래 키 (FK - Foregin Key)
- 다른 테이블의 기본키와 연결해주는 컬럼
- 외래키를 사용하면 외래키를 참조하는 테이블에 외래키에 해당하는 값이 있는지를 체크 할 수 있음
※ 기본 키 ↔ 외래 키를 사용하는 이유?
더보기
1. 강의 데이터 테이블이 하나 있음
2. 이 테이블은 '재생목록코드', '강의코드' 등을 가지고 있음
3. 중복이 없고 널값이 없는 '강의코드'를 PK로 설정
4. 또 다른 재생목록 데이터 테이블이 있음
5. 이 테이블은 '재생목록코드', '재생목록명' 등의 데이터를 있음
6. 중복이 없고 널값이 없는 '재생목록코드'를 PK로 설정
7. 개발자가 강의 데이터 테이블과 재생목록 테이블의 관계를 알고 싶음
8. 두 테이블 모두가 재생목록코드를 들고 있으므로 재생목록 데이터 테이블의 재생목록코드를 FK로 설정하는데 이때 강의코드(PK)를 참조하여 설정함
9. 이렇게 되면 강의코드만 호출해보면 재생목록코드를 볼 수 있게되고 거기에 대한 재생목록명, 강의수 등을 같이 볼 수 있게 됨
02 테이블 생성
- 총 5개의 테이블을 생성할 예정 (회사 데이터 DB)
- Employee, Branch, Client, Works_With, Branch Supplier
1) employee
CREATE TABLE employee (
emp_id INT PRIMARY KEY,
first_name VARCHAR(40),
last_name VARCHAR(40),
birth_day DATE,
sex VARCHAR(1),
salary INT,
super_id INT,
branch_id INT
);
2) branch
CREATE TABLE branch (
branch_id INT PRIMARY KEY,
branch_name VARCHAR(40),
mgr_id INT,
mgr_start_date DATE,
FOREIGN KEY(mgr_id) REFERENCES employee(emp_id) ON DELETE SET NULL
);
- 'employee' 테이블의 'emp_id'를 참조하여 'mrg_id'를 외래키로 설정
- 'ON DELETE SET NULL'은 외래키를 만들때 걸 수 있는 제약조건들중 하나 → ON DELETE/ON UPDATE 두개가 있는데 삭제/수정시에 뒤에 구문을 실행함. 즉 삭제시 삭제된 빈공간은 NULL값으로 처리.
3) employee + branch 테이블을 이용 외래키 설정
ALTER TABLE employee
ADD FOREIGN KEY(branch_id)
REFERENCES branch(branch_id)
ON DELETE SET NULL;
ALTER TABLE employee
ADD FOREIGN KEY(super_id)
REFERENCES employee(emp_id)
ON DELETE SET NULL;
- 'employee' 테이블에 컬럼명 'branch_id'를 외래키로 등록하는데 참조는 'branch' 테이블의 'branch_id'
- 'employee' 테이블에 컬럼명 'super_id'를 외래키로 등록하는데 참조는 'employee' 테이블의 'emp_id'
- 서로 다른 테이블 참조시에는 이해가 쉽지만 두번째 같은 테이블에서 참조를 하는 경우를 보자
'super_id'는 슈퍼바이저용 ID값으로 일반 사원의 ID(emp_id)를 참조하게 된다. 즉 한 회사에는 슈퍼바이저들이 있고 이 슈퍼바이저들은 각각의 사원들을 한사람씩 맡게된다는 뜻.
예로 'super_id = 100' 이면 'emp_id = 100'인 사람을 맡는다는 뜻.
4) client
CREATE TABLE client (
client_id INT PRIMARY KEY,
client_name VARCHAR(40),
branch_id INT,
FOREIGN KEY(branch_id) REFERENCES branch(branch_id) ON DELETE SET NULL
);
5) works_with
CREATE TABLE works_with (
emp_id INT,
client_id INT,
total_sales INT,
PRIMARY KEY(emp_id, client_id),
FOREIGN KEY(emp_id) REFERENCES employee(emp_id) ON DELETE CASCADE,
FOREIGN KEY(client_id) REFERENCES client(client_id) ON DELETE CASCADE
);
- PK는 중복/NULL값등 제약조건에 안벗어나면 여러개 지정 가능
- 'emp_id' + 'client_id' 는 PK 이자 FK 로 'employee' 테이블과 'client' 테이블을 참조하게 되고 총 세개의 테이블끼리 연결을 시켜 관계를 볼 수 있음
- ON DELETE CASDACE → FK 로 연결된 데이터들이 일관성을 유지할 수 있도록 하기 위해서 부모 테이블의 row 에 DELETE 또는 UPDATE 명령어를 적용할 때, 자동적으로 자식 테이블의 매치되는 row 에도 똑같이 DELETE 또는 UPDATE 를 반영하는 것을 의미
6) branch_supplier
CREATE TABLE branch_supplier (
branch_id INT,
supplier_name VARCHAR(40),
supply_type VARCHAR(40),
PRIMARY KEY(branch_id, supplier_name),
FOREIGN KEY(branch_id) REFERENCES branch(branch_id) ON DELETE CASCADE
);
03) 데이터 넣기
- 데이터는 'branch'에 따라 넣는다.
1) Corporate 브랜치
-- Corporate
INSERT INTO employee VALUES(100, 'David', 'Wallace', '1967-11-17', 'M', 250000, NULL, NULL);
INSERT INTO branch VALUES(1, 'Corporate', 100, '2006-02-09');
UPDATE employee
SET branch_id = 1
WHERE emp_id = 100;
INSERT INTO employee VALUES(101, 'Jan', 'Levinson', '1961-05-11', 'F', 110000, 100, 1);
2) Scranton 브랜치
-- Scranton
INSERT INTO employee VALUES(102, 'Michael', 'Scott', '1964-03-15', 'M', 75000, 100, NULL);
INSERT INTO branch VALUES(2, 'Scranton', 102, '1992-04-06');
UPDATE employee
SET branch_id = 2
WHERE emp_id = 102;
INSERT INTO employee VALUES(103, 'Angela', 'Martin', '1971-06-25', 'F', 63000, 102, 2);
INSERT INTO employee VALUES(104, 'Kelly', 'Kapoor', '1980-02-05', 'F', 55000, 102, 2);
INSERT INTO employee VALUES(105, 'Stanley', 'Hudson', '1958-02-19', 'M', 69000, 102, 2);
3) Stamford 브랜치
-- Stamford
INSERT INTO employee VALUES(106, 'Josh', 'Porter', '1969-09-05', 'M', 78000, 100, NULL);
INSERT INTO branch VALUES(3, 'Stamford', 106, '1998-02-13');
UPDATE employee
SET branch_id = 3
WHERE emp_id = 106;
INSERT INTO employee VALUES(107, 'Andy', 'Bernard', '1973-07-22', 'M', 65000, 106, 3);
INSERT INTO employee VALUES(108, 'Jim', 'Halpert', '1978-10-01', 'M', 71000, 106, 3);
- 나머지 테이블 데이터 넣기
1) branch supplier
-- BRANCH SUPPLIER
INSERT INTO branch_supplier VALUES(2, 'Hammer Mill', 'Paper');
INSERT INTO branch_supplier VALUES(2, 'Uni-ball', 'Writing Utensils');
INSERT INTO branch_supplier VALUES(3, 'Patriot Paper', 'Paper');
INSERT INTO branch_supplier VALUES(2, 'J.T. Forms & Labels', 'Custom Forms');
INSERT INTO branch_supplier VALUES(3, 'Uni-ball', 'Writing Utensils');
INSERT INTO branch_supplier VALUES(3, 'Hammer Mill', 'Paper');
INSERT INTO branch_supplier VALUES(3, 'Stamford Lables', 'Custom Forms');
2) client
-- CLIENT
INSERT INTO client VALUES(400, 'Dunmore Highschool', 2);
INSERT INTO client VALUES(401, 'Lackawana Country', 2);
INSERT INTO client VALUES(402, 'FedEx', 3);
INSERT INTO client VALUES(403, 'John Daly Law, LLC', 3);
INSERT INTO client VALUES(404, 'Scranton Whitepages', 2);
INSERT INTO client VALUES(405, 'Times Newspaper', 3);
INSERT INTO client VALUES(406, 'FedEx', 2);
3) works_with
-- WORKS_WITH
INSERT INTO works_with VALUES(105, 400, 55000);
INSERT INTO works_with VALUES(102, 401, 267000);
INSERT INTO works_with VALUES(108, 402, 22500);
INSERT INTO works_with VALUES(107, 403, 5000);
INSERT INTO works_with VALUES(108, 403, 12000);
INSERT INTO works_with VALUES(105, 404, 33000);
INSERT INTO works_with VALUES(107, 405, 26000);
INSERT INTO works_with VALUES(102, 406, 15000);
INSERT INTO works_with VALUES(105, 406, 130000);