mairadb
[마리아db] 에러 Can't create table `DB명`.`테이블명` (errno: 150 "Foreign key constraint is incorrectly formed")
reserve_inform 테이블에 reserve_num 을 admin_money 테이블의 reserve_num의 외래키로 설정하려던 중 에러가 났다.
열심히 구글링을 했는데 확인해 볼 부분이 있어 확인해보았다
1. 키 설정 확인하기
참조할 테이블안에 필드의 키 값이 메인키(PK)나 유니크 키 인지 확인해봤다.
reserve_num은 키 설정이 되있지 않았다.
확인 결과 : 문제 없음
2. CHARSET확인하기
둘 다 같은 설정으로 확인되었다.
확인 결과 : 문제 없음
3. 데이터 타입 확인하기
데이터 타입도 둘 다 int(11)로 되있기에 당연히 문제가 없다.
고 생각했는데...
참조할 테이블에 있는 필드에 unsigned가 체크 되어있었다.
나는 사실 저게 뭔지 몰랐다.
(테이블을 생성할 때 직접 쿼리를 짠게 아니라 erd 만드는 프로그램에서 테이블을 만들고 쿼리를 가져왔다.)
unsigned : mariadb에서 사용할 때 데이터 형식에 양수의 값만 저장할 수 있게 하는 데이터 형식
int의 범위는 -2,147,483,648 ~ 2,147,483,647로 42억개이며 4바이트 공간을 차지하는데
unsigned 형식을 쓰면 음수를 사용하지 않기에 -21억 공간을 양수로 사용해 0 ~ 4,294,967,295으로 사용할 수 있는 것이다.
주로 Auto_increment 설정시 사용한다고 한다.
테이블 생성시 reserve_num이 auto_increment 를 사용하기에 자동으로 체크를 한 것 같다.
체크를 해제하고 다시 외래키를 설정했더니
alter table admin_money add constraint fk_reserve_num foreign key reserve_num REFERENCES reserve_inform(reserve_num);
잘 설정 되었다.