DB + SQL

SQL ERROR 1005 Foreign key constraint is incorrectly formed 에러 원인

dev_SiWoo 2023. 2. 16. 13:28

MariaDB에서 Foreign key constraint is incorrectly formed 에러가 나는 이유는 주로 다음과 같다.

 

 

1. 참조하는 테이블이 존재하지 않는 경우

외래 키 제약 조건을 만들 때 참조하는 테이블이 존재하지 않으면 해당 에러가 발생할 수 있다.

 

 

2. 참조하는 테이블 간에 데이터 타입이나 인코딩(charset), 정렬 방식,  참조하는 컬럼의 길이가 일치하지 않는 경우 발생

위 이미지에서 만약에 참조 테이블인 test.sys_id 의 테이블의 sys_id라는 컬럼의 조합이 utf8mb4_general_ci 가 아니거나

데이터 타입이 VARCHAR가 아니거나 길이가 50이 아닐 경우 발생할 수 있다.

 

3. 인덱스가 없는 경우

외래 키 제약 조건을 만들 때 참조하는 컬럼에 인덱스가 없으면 해당 에러가 발생할 수 있다.

 

4.불일치하는 엔진을 사용하는 경우

외래 키 제약 조건을 만들 때 참조하는 테이블과 현재 테이블이 불일치하는 엔진을 사용하면 해당 에러가 발생할 수 있는데

보통 불일치하는 엔진을 사용하는 경우는 보통 InnoDB와 MyISAM 엔진을 함께 사용할 때 발생합니다. InnoDB는 외래 키 기능을 지원하고, MyISAM은 지원하지 않기 때문이다.

 

InnoDB는 트랜잭션 지원, 락 기능, 외래 키 기능 등 다양한 기능을 제공하는 반면에

Myisam은 트랜잭션 지원이 없고, 더 빠른 속도를 제공하는 특성이 있다.

 

 이러한 차이로 인해, InnoDB와 Myisam엔진을 함께 사용할 경우 외래 키 제약 조건을 만들 때, 불일치하는 엔진을 사용하는 경우가 발생할 수 있다.

 

(※. Myisam이 왜 더빠른가?)

 MyISAM은 트랜잭션 지원이 없기 때문에 데이터를 읽고 쓰는 속도가 더 빠르다고 한다.

 

이는 MyISAM이 트랜잭션 처리나 롤백 등의 기능을 처리하지 않아서 데이터를 읽고 쓰는 데에 소요되는 리소스가 더 적기 때문이다.

 

 반면, InnoDB는 트랜잭션 처리와 롤백, 복구 등의 기능을 처리해야 하기 때문에 더 많은 리소스를 사용하고

따라서 MyISAM과 비교했을 때 데이터 읽기와 쓰기 속도가 느리게 느껴질 수 있다.

 

 

※참고

트랜잭션 처리가 필요하고 대용량의 데이터를 다루기 위해서는 InnoDB엔진을 사용하고

트랜잭션 처리가 필요없고 운영에 ReadOnly 기능이 대부분인 서비스라면 MyISAM 엔진이 효율적이다.