-
MySQL 다시보기 02 - 테이블 생성 및 데이터 삽입SQL 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);
굿! 'SQL' 카테고리의 다른 글
MySQL 다시보기 04 - 중첩쿼리/ON DELETE/TRIGGER/ERD (0) 2021.10.04 MySQL 다시보기 03 - SELECT/FUNCTION/UNION/JOIN (0) 2021.10.04 MySQL 다시보기 01 - 데이터타입/CREATE/INSERT/DELETE/UPDATE/DELETE/기본코어쿼리 (0) 2021.10.03 SQL 초급 - MySQL 기반 웹사이트 만들기 02 (필터/좋아요/댓글) (0) 2021.10.01 SQL 초급 - MySQL 기반 웹사이트 만들기 01 (설치/기본뼈대) (0) 2021.10.01