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

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 엔진이 효율적이다.