반응형

테스트데이터로 들어가있는 데이터를 다 삭제하고 초기화하려고 truncate bookings;를 사용하면
mysql> truncate bookings;
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`myhoneytrip_test`.`passengers`, CONSTRAINT `passengers_booking_id_fcb39247_fk_bookings_id`)
이렇게 passengers테이블에서 bookings의 id를 참조하기때문에 삭제가 되지 않는다.
(passengers테이블에 데이터가 없어도!)
# passengers 데이터 없을때
mysql> delete from bookings;
Query OK, 1 row affected (0.07 sec)
# bookings데이터를 참조하는 passengers 데이터 있을때
mysql> delete from bookings;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`myhoneytrip_test`.`passengers`, CONSTRAINT `passengers_booking_id_fcb39247_fk_bookings_id` FOREIGN KEY (`booking_id`) REFERENCES `bookings` (`id`))
delete를 사용하면 passengers에 데이터가 없을 때만 삭제가 된다.
외래키 제약조건 해제
외래키 제약조건을 해제하면 다른 테이블에서 참조해도 데이터를 삭제할 수 있다.
SET foreign_key_checks = 0; # 외래키 제약 해제
Query OK, 0 rows affected (0.01 sec)
mysql> SET foreign_key_checks = 1; # 외래키 제약 설정(기본값)
Query OK, 0 rows affected (0.00 sec)
주의
외래키 제약조건을 해제하면 삭제되는 데이터를 외래키로 참조하는 데이터가 있어도 그냥 삭제가 된다.
(booking 3을 참조하는 passenger 1이 있는데
제약조건을 해제하고 booking 3을 삭제하면 passenger1은 없는 booking을 계속 참조함)
이점을 염두에 두고 테스트 데이터를 삭제할 때만 설정을 변경하는 것이 좋을것같다.
참고
https://www.sqlines.com/mysql/set_foreign_key_checks
https://www.mssqltips.com/sqlservertip/4248/differences-between-delete-and-truncate-in-sql-server/
반응형
'기타' 카테고리의 다른 글
| GitHub 꾸미기 | waka-box : 프로필에 코딩시간 표시하기 (0) | 2022.09.25 |
|---|---|
| VCS | CVS, SVN, Git (0) | 2022.09.22 |
| Httpie | HTTP요청 보내기 (0) | 2022.07.18 |
| zsh: command not found: conda 오류(Mac) (0) | 2022.07.15 |
| MySql 설치하기 (Mac intel) (0) | 2022.07.15 |