schema.sql
CREATE TABLE `user` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`name` varchar(255) not NULL,
`email` varchar(255) not NULL
);
CREATE TABLE `content` (
-- TODO: `id`
-- TODO: `title`
-- TODO: `body`
`id` int PRIMARY KEY AUTO_INCREMENT,
`title` varchar(255) not NULL,
`body` varchar(255) not NULL,
`created_at` timestamp not NULL DEFAULT CURRENT_TIMESTAMP,
`userId` int,
FOREIGN KEY (`userId`) REFERENCES `user` (`id`)
);
-- PART 5:
-- 아래 주석을 제거하고 category, content_category, role 테이블을 만드세요.
CREATE TABLE `category` (
-- TODO:
`id` int PRIMARY KEY AUTO_INCREMENT,
`name` varchar(255) not NULL
);
CREATE TABLE `content_category` (
-- TODO:
`id` int PRIMARY KEY AUTO_INCREMENT,
`contentId` int not NULL,
FOREIGN KEY(`contentId`) REFERENCES `content` (`id`) ,
`categoryId` int not NULL,
FOREIGN KEY(`categoryId`) REFERENCES `category` (`id`)
);
CREATE TABLE `role` (
-- TODO:
`id` int PRIMARY KEY AUTO_INCREMENT,
`name` varchar(255) not NULL
);
ALTER TABLE `user` ADD roleId int;
ALTER TABLE `user` ADD FOREIGN KEY (`roleId`) REFERENCES `role` (`id`);
1. 외래키(Foreign Key)란
외래키는 두 테이블을 서로 연결하는 데 사용되는 키이다.
외래키가 포함된 테이블을 자식 테이블이라고 하고 외래키 값을 제공하는 테이블을 부모 테이블이라한다.
2. 외래키 사용시 주의 사항
1) 외래키 값은 NULL이거나 부모 테이블의 기본키 값과 동일해야한다. (참조 무결성 제약조건)
2) 부모 테이블의 기본키, 고유키를 외래키로 지정할 수 있다.
3) 부모 테이블의 기본키, 고유키가 여러개의 컬럼으로 이루어져 있다면 부모가 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있다.
4) 외래키로 지정할 두 테이블의 필드는 같은 데이터 타입이어야 한다.
3. 외래키 옵션
1) On Delete
Cascade : 부모 데이터 삭제 시 자식 데이터도 삭제
Set null : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Null로 업데이트
Set default : 부모 데이터 삭제 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
Restrict : 자식 테이블이 참조하고 있을 경우, 데이터 삭제 불가
No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.
2) On Update
Cascade : 부모 데이터 업데이트 시 자식 데이터도 업데이트
Set null : 부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Null로 업데이트
Set default : 부모 데이터 업데이트 시 자식 테이블의 참조 컬럼을 Default 값으로 업데이트
Restrict : 자식 테이블이 참조하고 있을 경우, 업데이트 불가
No Action : Restrict와 동일, 옵션을 지정하지 않았을 경우 자동으로 선택된다.
4. 외래키 추가
ALTER TABLE employee
ADD FOREIGN KEY (dept_id) REFERENCES department(id);
6. 외래키 삭제
외래키를 삭제하려면 CONSTRAINT_NAME을 알아야한다.
select *
from information_schema.table_constraints
where TABLE_SCHEMA = 'DB명' and TABLE_NAME = '테이블명'
삭제하고 싶은 키의 CONSTRAINT_NAME을 확인한다.
ALTER TABLE [Table_Name]
DROP CONSTRAINT [CONSTRAINT_NAME];
또는
ALTER TABLE [Table_Name]
DROP FOREIGN KEY [CONSTRAINT_NAME];
# 외래키 이름을 검색한다. ex) employee_ibfk_1
select *
from information_schema.table_constraints
where TABLE_SCHEMA = 'myDB' and TABLE_NAME = 'employee'
# 외래키를 삭제한다.
ALTER TABLE employee
DROP FOREIGN KEY employee_ibfk_1;
#새로운 조건의 외래키를 추가한다.
#부모 행이 삭제되었을 경우 외래키 ID를 NULL로 업데이트한다.
ALTER TABLE employee
ADD CONSTRAINT employee_ibfk_1 FOREIGN KEY (dept_id) REFERENCES department(id) ON DELETE SET NULL;
'스프린트 > im-sprint-learn-sql' 카테고리의 다른 글
im-sprint-learn-sql---part4.js (0) | 2021.11.15 |
---|---|
im-sprint-learn-sql---part3.js (0) | 2021.11.15 |