ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
지울려고 하는 테이블의 row 가 다른 테이블에 foreign key로 묶여 있을때 나는 오류
ON DELETE CASCADE
foreign key 로 연결된 데이터들이 일관성을 유지할 수 있도록 하기 위해서, foreign key constraints 라는 것이 있습니다. 공식 문서는 CASCADE 를 foreign key constraints 에서 옵션으로 사용할 수 있는 Referential Actions 이라고 설명합니다.
CASCADE 는 부모 테이블의 row 에 DELETE 또는 UPDATE 명령어를 적용할 때, 자동적으로 자식 테이블의 매치되는 row 에도 똑같이 DELETE 또는 UPDATE 를 반영하는 것을 의미합니다. 이를 사용하기 위해서는 foreign key constraints 옵션에 ON DELETE CASCADE 를 설정해주어야 합니다. (ON UPDATE CASCADE 를 설정하면 UPDATE 를 할 때 CASCADE 옵션이 적용되겠죠.)
ON DELETE CASCADE 옵션을 적용하면 부모 테이블에서 row 를 삭제할 경우 연결된 자식 테이블의 row 가 함께 삭제됩니다. 연결된 데이터를 한 번에 지울 수 있어 데이터의 관리가 편리해지고 일관성을 유지할 수 있습니다.
ON DELETE CASCADE 는 테이블의 생성 시, 다시 말해 CREATE TABLE 명령어를 사용해 테이블을 생성할 때 적용하게 됩니다. 만약 이미 테이블이 생성되었다면, ALTER TABLE 명령어를 활용해 기존의 foreign key 부분을 지웠다가 다시 생성하는 방식으로 사용할 수 있습니다.
기존의 foreign key 를 제거하고 다시 추가하는 방법은 다음과 같습니다
// _로 연결된 부분에 사용할 값을 넣으시면 됩니다.
// 기존의 foreign key 지우는 방법
ALTER TABLE table_name DROP FOREIGN KEY foreign_key_symbol
// 실제 사용 예제
ALTER TABLE order_items DROP FOREIGN KEY order_items_ibfk_1;
// ON DELETE CASCADE 포함한 foreign key 재생성
// 괄호가 있는 경우 괄호를 꼭 사용해야 합니다.
ALTER TABLE 자식_table_name
ADD FOREIGN KEY (foreign_key_연결받을_자식_테이블의_column_name)
REFERENCES 부모_table_name (foreign_key_로_가져올_column_name)
ON DELETE CASCADE;
// 실제 사용 예제
ALTER TABLE order_items
ADD FOREIGN KEY (item_id)
REFERENCES orders (id)
ON DELETE CASCADE;
.
외래키 확인법 ( 테이블 기준)
select * from information_schema.table_constraints where table_name = '테이블명';
외래키 확인법 ( 스키마 기준)
select * from information_schema.table_constraints where constraint_schema = '데이터베이스명';
출처 :
'DB > MySQL' 카테고리의 다른 글
[Mysql] 컬럼 값 하나로 문자열로 합치기( GROUP_CONCAT) (0) | 2023.09.15 |
---|---|
[Mysql] 그룹화하여 데이터 조회 (GROUP BY) + HAVING (0) | 2023.09.15 |
[Mysql] 형 변환 CAST, CONVERT 차이 점 및 예시 (0) | 2023.09.15 |
[Mysql] ADDDATE , INTERVAL 사용해서 특정 날짜 (연, 월, 일, 시, 분, 초) 더하기 및 빼기 (0) | 2023.09.15 |
[My-SQL] Insert 한 값의 AUTO_INCREMENT된 값 가져오기 (0) | 2023.01.30 |