FOREIGN KEY constraint - 외래 키 제약 조건
당신은 이미 기본 키를 어떻게 만드는 지 알고 있으며, 데이터베이스와 그 내부에 테이블을 만드는 법을 압니다.
당신이 정말로 강력한 데이터베이스를 만들고 싶다면, 어떻게 테이블들을 같이 연결 할 수 있는 지 알아야 합니다.
예제를 고려 해 봅시다 :
우리는 직원과 일하는 부서에 대한 정보를 저장하고 싶습니다.
모든 정보를 하나의 테이블로 만들 수 있습니다.
하지만, 새로운 부서가 열린다면 당장 누구도 고용할 수 없습니다.
우리는 그것에 대한 정보를 어떻게 저장할까요?
정답은 두 개의 다른 테이블을 생성한다면 더 쉬워집니다. : employees, departments
여기, 우리가 마주한 다른 문제 (도전) 이 있습니다. :
- 이 테이블들의 데이터를 어떻게 연결 할 것인가?
- 만약 존재하지 않는 부서 이름을 가진 직원을 추가한다면 발생하는 문제를 어떻게 피할 수 있는가?
이 주제에서는, 당신이 외래 키 제약을 이용하여 어떻게 두 개의 테이블을 연결하고 그 곳에 저장된 데이터를 관리하는지 배웁니다.
우리는 MySQL 예제 및 구문을 제공하고 있다는 것을 참고하세요.
다른 SQL 용어 및 구문은 쿼리가 조금 다르게 보일 겁니다.
FOREIGN KEY constraint - 외래 키 제약
department_id INT PRIMARY KEY
, department_name VARCHAR(20) NOT NULL
위 두 개의 컬럼을 가진 테이블 departments
를 이미 가지고 있다고 가정 해 봅니다.
deparment_id | department_name |
---|---|
1 | IT |
2 | HR |
3 | PR |
우리는 employee_id INT PRIMARY KEY
, name VARCHAR(60)
, department_id INT
컬럼을 가진 employees
테이블을 만들고 싶어합니다.
직원은 존재하는 부서에서만 일할 수 있으므로,
테이블 employees
의 컬럼 department_id
의 모든 값은 테이블 departments
의 department_id
에 알맞는 값을 가져야만 합니다.
이렇게 해서 두 컬럼이 연결되어야 합니다.
두 테이블 간의 연결을 만들기 위해서, 우리는 employees
테이블에서 department_id
를 외래 키, 혹은 참조 키로 표시 할 수 있습니다.
데이터베이스 관리 시스템이 우리를 위해 외래 키가 employees
테이블에 저장 될 수 있도록 데이터를 컨트롤합니다.
외래 키 제약은 오직 같은 데이터베이스의 테이블에서만 참조할 수 있다는 것을 참고하세요.
하나의 필드, 혹은 그룹 필드를 외래 키로서 표시하기 위해,
우리는 외래 키 제약을 사용할 수 있고, employees
테이블을 만들 수 있습니다.
쿼리에서는, REFERENCES
키워드가 테이블과 기본키 컬럼, 혹은 기본키 컬럼들을 표기하는데, (괄호와 함께.)
이 값들은 고유값 값으로 외래 키를 향하고 있습니다.
해석 : 외래 키를 가져온다는 것은, 참조되는 값들이 해당 테이블에서 기본 키에 해당되는 값들이라는 것이다.
기본 키의 구조와 데이터 타입과 외래 키는 반드시 동일해야 합니다.
외래 키 테이블의 중요한 점은 참조 테이블, 혹은 상위 (부모) 테이블로 불린다는 것 입니다.
여기 쿼리 예시가 있습니다. :
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(60) NOT NULL,
deparment_id INT,
CONSTRAINT fk_department FOREIGN KEY (deparment_id)
REFERENCES departments(deparment_id)
);
이 쿼리 실행 후, employees
테이블은 하위 (자식) 테이블이 되며,
그 의미는, 테이블이 외래 키 (참조 키) 를 담고 있다는 것 입니다.
지금 만약 employees
테이블에 튜플 (1, 'Ann Riding', 4)를 넣으려고 시도한다면 에러가 납니다.
이유는 departments
테이블이 해당 부서에 맞는 레코드 (줄)을 가지고 있지 않기 때문입니다.
추측 : 참조 무결성에 위반됨. 부모 (상위) 테이블의 PK는 무조건 존재해야 한다.
위의 쿼리에서, 우리는 이름을 가진 외래 키를 만들었습니다.
이름지어진 외래 키만 사용하는 것은 좋은 연습인데,
다른 몇몇 SQL 관리 시스템은 이름없는 외래 키 가 추후 문제를 일으킬 수도 있기 때문입니다.
하지만, 여전히 이름없는 외래 키 와 함께 테이블을 만들 수 있습니다. :
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(60) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
Referential actions - 참조 작업
employees
테이블에 몇몇 데이터를 추가한다고 가정하고,
테이블 departments
와 employees
간의 연결이 이와 같이 생겼다고 가정합니다. :
employees
employee_id | name | department_id |
---|---|---|
1 | Tom Jones | 2 (HR) |
2 | Ann Riding | 1 (IT) |
departments
department_id | department_name |
---|---|
1 | IT |
2 | HR |
3 | PR |
department
테이블의 데이터를 업데이트, 혹은 삭제한다면,
employees
테이블에서 알맞는 데이터로 변경 해야 합니다.
이 변화의 결과는 참조 작업 에 의존하고 있습니다.
우리는 데이터를 변경할 때, SQL이 어떻게 행동해야 하는지 표기할 수 있는데,
ON DELETE
, ON UPDATE
액션을 사용할 수 있습니다.
각기 다른 액션을 표기 할 수 있습니다 :
- CASCADE : 상위 테이블의 줄이 삭제되거나 업데이트된다면, 이와 매칭되는 모든 줄 이 자동적으로 삭제되거나, 업데이트됩니다.
- SET NULL : 상위 테이블의 줄이 삭제되거나 업데이트된다면, 이와 매칭되는 하위 테이블의 외래 키(참조 키) 의 값은 자동적으로 NULL이 됩니다.
- RESTRICT : 상위 테이블의 줄을 삭제하거나 업데이트하려고 시도한다면, 이 명령을 거절한다.
- SET DEFAULT : 참조 키에 해당되는 알맞는 값이 삭제되거나 업데이트된다면, 하위 테이블의 외래 키 값은 기본 값으로 설정한다.
- NO ACTION : 이 키워드는 참조(상위) 테이블의 값이 변경 될 때, 사용하고 있는 시스템에 의존한다.
MySQL에서는 RESTRICT 키워드와 동일하므로,employee
테이블을 위의 쿼리와 같이 생성 했다면,
departments
테이블에서의 삭제와 업데이트는 금지됩니다.
ON UPDATE
, ON DELETE
액션으로 설정하여 SQL 쿼리를 변경 해 봅시다.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(60) NOT NULL,
department_id INT,
CONSTRAINT fk_department FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE SET NULL
ON UPDATE CASCADE
);
연결된 상위 테이블의 department_id 가 삭제된다면, NULL로 설정한다.
연결된 상위 테이블의 department_id 가 업데이트된다면, 자동으로 업데이트한다.
Add FOREIGN KEY to the existing table - 존재하는 테이블에 외래 키 추가하기
이미 존재하는 테이블에 외래 키를 추가하기 위해서, ALTER TABLE ADD FOREIGN KEY
문법을 사용할 수 있습니다.
만약 employees
테이블을 외래 키 없이 만들었다면, 간단한 SQL 쿼리로 간단하게 추가할 수 있습니다. :
ALTER TABLE employees
ADD FOREIGN KEY (department_id) REFERENCES departments(department_id);
이름있는 외래 키, 혹은 다중 컬럼을 위한 외래 키 제약을 추가하고자 한다면,
ALTER TABLE ADD CONSTRAINT
문법을 사용합니다. :
ALTER TABLE employees
ADD CONSTRAINT fk_department FOREIGN KEY (department_id)
REFERENCES departments(department_id);
다중 외래 키 컬럼을 가진 테이블을 만들고자 한다면, 그저 괄호 안에 여러 개의 컬럼들을 표기하면 됩니다.
ON UPDATE
, ON DELETE
액션을 이 쿼리에 추가하고자 한다면, 표기하면 됩니다.
Drop foreign key - 외래 키 삭제하기
외래 키를 삭제하기 위해서ㅕ, ALTER TABLE DROP FOREIGN KEY
문법을 사용합니다 :
ALTER TABLE employees
DROP FOREIGN KEY fk_department;
MySQL 에서, 우리는 삭제 해야 할 외래 키의 이름을 알고 있습니다.
이것이 왜 이름있는 외래 키를 사용하는 것이 좋은 연습인지에 대한 이유 중 하나입니다.
하지만, 당신이 이름없는 외래 키 제약을 만들었다면, DBMS가 이름을 자동적으로 생성합니다.
이 경우, 외래 키 이름을 얻기 위해서, 밑의 구문을 사용하세요 :
SHOW CREATE TABLE table_name;
Conclusion - 결론
외래 키 제약은 유용한 SQL 기능인데,
이는 테이블을 아우러 관련된 데이터를 상호-참조 할 수 있게 해주기 때문입니다.
이제 당신이 이것이 어떻게 작동되는지 알며, 어떻게 외래 키와 함께 테이블을 만드는지 알며,
기존 테이블에 외래 키를 추가 혹은 삭제하는 방법에 대해 알게 되었습니다.
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introducing to SQL' 카테고리의 다른 글
Types of JOINs - JOIN의 종류들 (0) | 2024.04.24 |
---|---|
Results ordering - 결과 정렬하기 (1) | 2024.04.22 |
PRIMARY KEY constraint - 기본 키 제약 조건 (0) | 2024.04.20 |
Alter table - 테이블 변경하기 (1) | 2024.04.19 |
Intro to MySQL - MySQL에 대한 소개 (0) | 2024.04.17 |