본문 바로가기

SQL & DB

SQL Error [1451] [23000]: (conn=15) Cannot delete or update a parent row: a foreign key constraint fails ( 해결방법 : FOREIGN KEY에 ON DELETE CASCADE 추가하기)

해당 오류는 연계참조무결성 제약조건으로 생기는 오류이다.

 

↓ 처음 테이블을 생성할 때 ON DELETE CASCADE 옵션을 추가하고 작업하였다면 상관없지만

CREATE TABLE products(
	pd_id INT(10) PRIMARY KEY,
	sup_id INT(10),
	price INT(10),
	FOREIGN KEY (sup_id) REFERENCES supplier(sup_id) ON DELETE CASCADE
);

 

 

↓ ON DELETE CASCADE 옵션없이 작업하다가 데이터를 삭제할 경우

DELETE FROM supplier WHERE sup_id = 1;

 

 

↓ SQL Error [1451] [23000]: (conn=15) Cannot delete or update a parent row: a foreign key constraint fails  가 발생한다.

 

 

그럼 ON DELETE CASCADE 조건없이 테이블을 만든 후 작업하다가  ON DELETE CASCADE 옵션 추가하고 싶을 경우가 생긴다면?

 

1) 일단 해당테이블의 제약조건을 확인해보자

방법1) 

SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAME ='products';

 

 

방법2) 테이블에 들어가서 외래키 확인 (*변경하려는 포린키 맞는지 상세보기로 확인)

 

 

2) foreign key 제거하기

ALTER TABLE [테이블명] DROP FOREIGN KEY [포린키의 이름];
ALTER TABLE products DROP FOREIGN KEY products_ibfk_1;

 

↓ 제약조건확인시  'products_ibfk_1' 이라는 포린키가 삭제되었다.

 

 

3) foreign key 다시 추가하기 (+ ON DELETE CASCADE 옵션)

ALTER TABLE [테이블명] add FOREIGN KEY([컬럼명]) REFERENCES [부모테이블명][(컬럼명)] ON DELETE CASCADE;

 

 

↓ 외래키에 on delete cascade 적용

ALTER TABLE products add FOREIGN KEY(sup_id) REFERENCES supplier(sup_id) ON DELETE CASCADE;

 

 

↓ 들어간것 확인되면 다시 지워보자

DELETE FROM supplier WHERE sup_id = 1;

 

 

↓ SQL Error [1451] [23000]: (conn=15) Cannot delete or update a parent row: a foreign key constraint fails 오류없이 삭제가 되었다.