외래키를 생성하려 했으나 실패하고 index만 생성됐다. 외래키 생성이 제대로 되지 않는다면 여러 이유가 있을 수 있다.
1. 데이터 유형 불일치
2. 참조 무결성 제약 조건 위반
3. 테이블 잠김: MySQL의 경우, MyISAM 엔진은 외래키 지원을 하지 않는다.
확인해 보니, FK 생성이 되지 않는 테이블만 엔진이 MyISAM으로 되어 있었다.
InnoDB는 외래키 지원, 트랜잭션 지원, ACID 등의 특징이 있다.
반면, MyISAM은 외래 키 및 트랜잭션 지원을 하지 않는다. 인덱스 테이블을 디스크에 저장하고 테이블 단위의 잠금을 제공하는 특징이 있어서 읽기 전용 (select) 작업이 많은 경우에는 더 빠른 성능을 제공한다.
테이블의 스토리지 엔진을 확인하는 방법:
'SHOW TABLE STATUS LIKE '테이블 이름';

이런 식으로 출력된다
MyISAM에서 InnoDB로 엔진 변경하는 방법:
ALTER TABLE your_table_name ENGINE=InnoDB;
이 명령어는 기존 테이블 데이터를 그대로 유지하면서 스토리지 엔진을 변경한다.
하지만! 엔진을 변경하는 건 데이터베이스의 성능에 영향을 줄 수 있다고 한다.
현재 MyISAM으로 엔진이 설정되어 있는 cart 테이블에는 아무 데이터도 없다.
아무런 데이터가 없다면, 엔진을 변경하는 것보다 테이블을 드랍하고 새로 만드는 게 더 간단하고 빠를 수 있다.
DROP TABLE your_table_name;
CREATE TABLE your_table_name (
-- 테이블 스키마
) ENGINE=InnoDB;
이렇게 하면 새로 생성하는 테이블에 대해서 스토리지 엔진을 명시적으로 지정해줄수 있다.
(MySQL 5.5 이후부터는 기본 스토리지 엔진으로 InnoDB가 설정되어 있다.)
[MySQL]InnoDB VS MyISAM
MySQL의 스토리지 엔진으로 가장 많이 사용하는 엔진으로는 InnoDB와 MyISAM이 있다. InnoDB 엔진은 트랜잭션 처리가 필요하고 대용량의 데이터를 다루는 부분에서 효율적이고, MyISAM 엔진은 트랜잭션
velog.io