logo

캐스케이드 삭제 시 MySQL

MySQL의 ON DELETE CASCADE 절은 자동으로 사용됩니다. 제거하다 상위 테이블에서 행을 삭제할 때 하위 테이블에서 일치하는 레코드를 삭제합니다. 에 관련된 일종의 참조행위이다. 외래 키 .

외래 키 관계에서 FOREIGN KEY를 사용하여 두 테이블을 만들어 두 테이블을 모두 부모와 자식으로 만들었다고 가정합니다. 다음으로, 계단식 작업이 성공하려면 다른 FOREIGN KEY에 대해 설정해야 하는 ON DELETE CASCADE 절을 정의합니다. ON DELETE CASCADE가 하나의 FOREIGN KEY 절에만 정의된 경우 계단식 작업에서 오류가 발생합니다.

MySQL ON DELETE 캐스케이드 예

MySQL 테이블에서 ON DELETE CASCADE 절을 사용하는 방법을 이해해 보겠습니다. 먼저, 다음과 같은 두 개의 테이블을 생성하겠습니다. 직원 및 지불 . 두 테이블 모두 삭제 계단식 작업과 함께 외래 키를 통해 관련됩니다. 여기서 Employee는 상위 테이블 , 결제는 어린이 테이블 . 다음 스크립트는 해당 레코드와 함께 두 테이블을 모두 생성합니다.

표: 직원

다음 문은 Employee 테이블을 생성합니다.

 CREATE TABLE Employee ( emp_id int(10) NOT NULL, name varchar(40) NOT NULL, birthdate date NOT NULL, gender varchar(10) NOT NULL, hire_date date NOT NULL, PRIMARY KEY (emp_id) ); 

그런 다음 삽입 쿼리를 실행하여 레코드를 채웁니다.

 INSERT INTO Employee (emp_id, name, birthdate, gender, hire_date) VALUES (101, 'Bryan', '1988-08-12', 'M', '2015-08-26'), (102, 'Joseph', '1978-05-12', 'M', '2014-10-21'), (103, 'Mike', '1984-10-13', 'M', '2017-10-28'), (104, 'Daren', '1979-04-11', 'M', '2006-11-01'), (105, 'Marie', '1990-02-11', 'F', '2018-10-12'); 

SELECT 쿼리를 실행하여 아래에 표시된 테이블의 데이터를 확인합니다.

캐스케이드 삭제 시 MySQL

표: 결제

아래 문은 결제 테이블을 생성합니다.

 CREATE TABLE Payment ( payment_id int(10) PRIMARY KEY NOT NULL, emp_id int(10) NOT NULL, amount float NOT NULL, payment_date date NOT NULL, FOREIGN KEY (emp_id) REFERENCES Employee (emp_id) ON DELETE CASCADE ); 

다음으로 삽입문 레코드를 테이블에 채우려면

 INSERT INTO Payment (payment_id, emp_id, amount, payment_date) VALUES (301, 101, 1200, '2015-09-15'), (302, 101, 1200, '2015-09-30'), (303, 101, 1500, '2015-10-15'), (304, 101, 1500, '2015-10-30'), (305, 102, 1800, '2015-09-15'), (306, 102, 1800, '2015-09-30'); 

SELECT 쿼리를 실행하여 아래에 표시될 수 있는 테이블의 데이터를 확인합니다.

캐스케이드 삭제 시 MySQL

우리를 보자 삭제 상위 테이블 Employee의 데이터입니다. 이렇게 하려면 다음 문을 실행합니다.

 mysql> DELETE FROM Employee WHERE emp_id = 102; 

위의 명령문은 해당 직원 기록을 삭제합니다. emp_id = 102 그리고 참조 데이터를 자식 테이블에 넣습니다. 다음 출력을 제공하는 SELECT 문을 사용하여 데이터를 확인할 수 있습니다.

캐스케이드 삭제 시 MySQL

위 출력에서 ​​emp_id = 102를 참조하는 모든 행이 두 테이블에서 자동으로 삭제되었음을 확인할 수 있습니다.

ON DELETE CASCADE 작업으로 영향을 받은 테이블을 찾는 방법은 무엇입니까?

때로는 테이블에서 레코드를 삭제하기 전에 ON DELETE CASCADE 참조 작업으로 영향을 받은 테이블을 알고 싶을 때가 있습니다. 다음과 같이 information_schema 데이터베이스의 reference_constraints에서 쿼리하여 이 정보를 찾을 수 있습니다.

 USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'database_name' AND referenced_table_name = 'parent_table' AND delete_rule = 'CASCADE' 

아래 문은 ON DELETE CASCADE 규칙을 사용하여 Employee 테이블과 연결된 테이블에 대한 결과를 생성합니다. 직원 DB 데이터 베이스:

 USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'employeedb' AND referenced_table_name = 'Employee' AND delete_rule = 'CASCADE'; 

위의 명령을 실행하면 아래와 같은 출력이 표시됩니다.

캐스케이드 삭제 시 MySQL

업데이트 캐스케이드의 MySQL

ON UPDATE CASCADE 절 MySQL 에 사용된다 업데이트 상위 테이블의 행을 업데이트하면 자동으로 하위 테이블의 일치 레코드가 생성됩니다. 다음 예에서는 이를 더 명확하게 설명합니다.

먼저, 우리는 테이블 변경 아래와 같이 테이블 결제에 ON UPDATE CASCADE 절을 추가하는 문:

 ALTER TABLE Payment ADD CONSTRAINT `payment_fk` FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE; 

다음과 같은 출력이 제공됩니다.

캐스케이드 삭제 시 MySQL

아래 스크립트에서는 상위 테이블의 직원 ID를 업데이트하고 하위 테이블에도 이 변경 사항이 자동으로 반영됩니다.

 mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103; 

Employee 및 Payment 테이블의 내용을 확인하면 다음을 볼 수 있습니다. emp_id 열 값이 성공적으로 업데이트됩니다.

캐스케이드 삭제 시 MySQL