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 엔진이 효율적이다.
'DB + SQL' 카테고리의 다른 글
SQL - COALESCE (0) | 2023.11.07 |
---|---|
SQL문의 처리과정에 대해 - parsing, execution, fetch (0) | 2023.08.30 |
Mysql DB - 접속원리 (0) | 2022.12.21 |
SQL - INSERT INTO WHERE NOT EXISTS (0) | 2022.04.07 |
MySQL - 매월 마지막일, 매월 첫일 구하기 (0) | 2022.03.30 |