MySQL에서 외래 키 제약 조건 끄기
오늘은 MySQL Workbench에서 FOREIGN_KEY_CHECKS
를 사용하여 MySQL에서 외래 키 제약 조건을 일시적으로 해제하는 방법을 배웁니다.
MySQL에서 외래 키 제약 조건 끄기
일시적으로 외래 키를 해제하는 다양한 상황이 있습니다. 예를 들어, 어떤 순서로든 부모
및 자식
테이블에 데이터를 로드합니다.
이 경우 FOREIGN_KEY_CHECKS
를 사용하여 MySQL 서버에서 외래 키 제약 조건을 끌 수 있습니다. 이를 알아보기 위해 두 개의 테이블을 만들고 먼저 채워 보겠습니다.
예제 코드:
# create a `student` table
CREATE TABLE student(
student_id INT NOT NULL PRIMARY KEY,
student_name VARCHAR(255) NOT NULL
);
# create a `course` table
CREATE TABLE course(
course_id INT NOT NULL PRIMARY KEY,
course_name VARCHAR(255),
student_id INT,
FOREIGN KEY(student_id)
REFERENCES student(student_id)
);
예제 코드:
# insert data into the `student` table
INSERT INTO student(student_id, student_name)
VALUES
(1, 'Maryam Taymor'),
(2, 'Mehvish Ashiq'),
(3, 'James Daniel'),
(4, 'Rahul Agarwal');
# insert data into the `course` table
INSERT INTO course(course_id, course_name, student_id)
VALUES
(1, 'Java Programming', 4),
(2, 'Data Science', 3),
(3, 'Computer Vision', 2),
(4, 'Python Programming', 1);
SELECT
명령을 사용하여 두 테이블의 현재 데이터를 확인하십시오.
SELECT * FROM student;
SELECT * FROM course;
출력(student
테이블의 경우):
+------------+---------------+
| student_id | student_name |
+------------+---------------+
| 1 | Maryam Taymor |
| 2 | Mehvish Ashiq |
| 3 | James Daniel |
| 4 | Rahul Agarwal |
+------------+---------------+
4 rows in set (0.00 sec)
출력(코스
테이블의 경우):
+-----------+----------------------+------------+
| course_id | course_name | student_id |
+-----------+----------------------+------------+
| 1 | Java Programming | 4 |
| 2 | Data Science | 3 |
| 3 | Computer Vision | 2 |
| 4 | Python Programming | 1 |
+-----------+----------------------+------------+
4 rows in set (0.00 sec)
MySQL에서 외래 키를 끄도록 FOREIGN_KEY_CHECKS
를 설정합니다.
자바 프로그래밍
에 등록하려는 다른 학생이 있다고 가정해 보겠습니다. 이번에는 하위 테이블(course
테이블)에 해당 레코드를 먼저 삽입하려고 합니다.
예제 코드:
INSERT INTO course(course_id,course_name, student_id)
VALUES
(5, 'Java Programming', 5);
course
테이블에 레코드를 삽입하기 위해 쿼리를 실행하자마자 다음 오류가 생성됩니다.
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`ms23`.`course`, CONSTRAINT `course_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`))
이는 course
테이블에 외래 키가 있기 때문에 발생합니다. 따라서 다음과 같이 외래 키 검사를 비활성화할 수 있습니다.
SET foreign_key_checks = 0;
이제 course
테이블에 다시 삽입하십시오.
INSERT INTO course(course_id,course_name, student_id)
VALUES
(5, 'Java Programming', 5);
이번에는 레코드가 성공적으로 삽입되었습니다. SELECT
명령을 사용하여 삽입을 확인하십시오.
SELECT * from course;
출력(코스
테이블의 경우):
+-----------+----------------------+------------+
| course_id | course_name | student_id |
+-----------+----------------------+------------+
| 1 | Java Programming | 4 |
| 2 | Data Science | 3 |
| 3 | Computer Vision | 2 |
| 4 | Python Programming | 1 |
| 5 | Java Programming | 5 |
+-----------+----------------------+------------+
5 rows in set (0.00 sec)
외래 키 제약 검사를 다시 활성화하려면 FOREIGN_KEY_CHECKS
의 값을 1
로 설정하는 것을 잊지 마십시오.
SET foreign_key_checks = 1;
phpMyAdmin
에서 동일한 명령을 사용할 수도 있지만 다음 스크린샷에서 강조 표시된 옵션을 선택 취소해야 합니다.
FOREIGN_KEY_CHECKS
의 값을 다시 1
로 설정하면 외래 키 검사를 끈 후 삽입한 현재 데이터에 대한 유효성 검사가 트리거되지 않습니다.
데이터베이스에 대한 새 업데이트 및 추가 사항만 확인합니다. 또한 FOREIGN_KEY_CHECKS
를 사용하여 외래 키 제약 조건을 전역적으로 비활성화할 수 있습니다.
예제 코드:
# turn off foreign key constraints globally
SET GLOBAL FOREIGN_KEY_CHECKS=0;
# turn on foreign key constraints globally
SET GLOBAL FOREIGN_KEY_CHECKS=1;