Christmas Pikachu CASCADE
개발일지/Database

CASCADE

ZI_CO 2022. 10. 19.
  1. DELETE 는 테이블 내의 레코드를 삭제할 때 사용하는 명령어입니다.
     
    학생에 관한 정보를 모아둔 위와 같은 테이블이 있다고 할 때, DELETE 를 활용하면 조건에 따라 개별 학생의 정보가 담긴 row 를 하나씩 지우거나, 혹은 테이블 내의 모든 row 를 지우는 것이 가능합니다.
     
    하지만 여러 개의 테이블이 foreign key 로 묶여있을 경우에는 상황이 조금 다릅니다. 서로가 연결되어 있기 때문에 어느 하나를 지워서는 정보가 꼬이는 상황이 발생할 수 있죠.
     
    MySQL 에서는 만약 어떤 테이블의 row 의 정보가 다른 테이블과 foreign key 로 묶여있을 때 DELETE 명령어를 사용해 row 를 삭제하려고 하면,
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 와 같은 에러 메시지를 보여주며 DELELTE 처리를 거부합니다.
     
    에러 메시지를 살펴보면 parent row 라는 표현을 확인할 수 있습니다.
     
    foreign key 로 묶일 때 부모와 자식의 관계가 성립하기 때문인데요.
     
    primary key 값을 foreign key 로 전달하는 쪽이 '부모', foreign key 를 받아오는 쪽이 '자식' 이라고 할 수 있습니다. 부모 쪽의 row 를 먼저 지울 수는 없지만 자식 쪽의 row 를 지우는 것은 가능합니다.
     
    연결된 자식 데이터를 전부 지우고 나면 부모 쪽의 데이터를 지우는 것이 가능합니다.

 

create table employee_new2 (select * from employee); 
create table payment_new2 (select * from payment); 

select * from employee_new2;
select * from payment_new2;

-- 1. PK 추가 하는 방법 
alter table employee_new2 add constraint emp_id primary key(emp_id);
desc employee_new2;
-- 2. delete cascade 먼저 걸려 있으면 다 삭제 (반드시) 

-- ON DELETE CASCADE 이미 존재하면 더 추가 할 수 없다. 
alter table payment_new2 
add constraint foreign key(emp_id)
references employee_new2(emp_id)
on DELETE cascade on UPDATE cascade;


select * from employee_new2;
select * from payment_new2;

update employee_new2 set emp_id = 2002 where emp_id = 102;


/** 
신규 생성시 UPDATE, DELETE 한번에 추가 하는 방법 
CREATE TABLE child (
	id INT, 
	parent_id INT,
	INDEX par_ind (parent_id),
	FOREIGN KEY (parent_id) 
		REFERENCES parent(id)
		ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=INNODB;
*/





'개발일지 > Database' 카테고리의 다른 글

블로그 DB 시나리오  (0) 2022.10.19
CRUD - (JDBC)  (0) 2022.10.18
Class for Class  (0) 2022.10.18
JAVA와 MySQL(DB) 연결하기  (0) 2022.10.18
BETWEEN 사용법  (0) 2022.10.13

댓글