결론.
다른 table의 column(int type)에서 foreign key를 통해 새롭게 column(int type)을 생성할 때, 정수값(int, integer)이 갖는 범위를 일치시켜줘야 함. signed 또는 unsigned를 붙여서 선언해준다.
문제.
MySQL에서 CREATE TABLE을 하면서, table 안에 column을 같이 선언해준다.
이때, int type의 column을 선언할 때, 단순히 int만 써주면 'Error Code: 3780' 에러가 발생한다.
정확하게는 이미 만들어진 Table에서 foreign key로 가져오는 column값과 내가 선언하려는 int type의 column값과 서로 일치해야한다.
- 이미 'product' table에서 'id' column을 'int unsigned'로 선언함
- 새롭게 'review' table을 만들면서, 'product_id' column을 선언하고, 이 값은 product table - id column을 foreign key을 통해 가져옴
- 둘 다 정수형(Integer) 타입일 때, 정수값이 갖는 범위를 일치시켜야 가능함
그래서, 'incompatible (호환되지 않는)'이라는 error가 발생
정수형(int) 변수는 4byte의 저장공간을 할당 받기 때문에 4,294,967,296개의 숫자 범위를 갖는다.
따라서, signed / unsigned 명령어에 따라 범위가 달라진다.
- signed : -2,147,483,648 ~ 2,147,483,647
- unsinged : 0 ~ 4,294,967,295
[참고] MySQL 정수형 변수 타입별 표
타입 | 저장공간 | ||
tinyint | 1 byte | -128 ~ 127 | 0 ~ 255 |
smallint | 2 byte | -32,768 ~ 32,767 | 0 ~ 65,535 |
mediumint | 3 byte | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
int | 4 byte | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
bigint | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
0 ~ 18,446,744,073,709,551,615 |