음머어's 까망별

블로그 이미지
무지 인간의 첫 걸음..
by 까망별 음머어
  • 383,339Total hit
  • 135Today hit
  • 132Yesterday hit

'errno: 150'에 해당되는 글 1건

  1. 2009.01.09
    [MySQL] ERROR 1005 (errno: 150) (7)

일전에 errno 1005상황에 대해 설명하면서, 아주 약간 errno: 150을 언급했었다..
******************************************************************************
LINK : [MySQL] ERROR 1005 (errno: 121)  에 대한 나의 글.
******************************************************************************

흠..  그 당시에는, 별로 신경쓰지 않았던 errno:150.
그런데 errno:150을 직접 맞딱드리게 되니,
이넘에 대해 알아보고픈 욕구를 스믈스믈 피워올리게 만든다. --;;


이 문제를 해결하기 위해선 아래의 링크를 참조하면 좋을 듯 하다.
******************************************************************************
LINK1 : FOREIGN KEY 사용에 대한 리퍼런스(한글), 
           FOREIGN KEY 사용에 대한 리퍼런스(영어),

LINK2 : 에러 상황에 대한 MySQL 리퍼런스(영어)

LINK3 : FORUM 에서 이루어졌던, errno: 150 에 대한 토론(영어)
******************************************************************************


나름 위 LINK들을 요약하자면 다음과 같다.
******************************************************************************
INNODB에서의 FOREIGN KEY는 
  1. 반드시 아버지와 자식은 INNODB 여야 한다.
  2. 아들이 참조하는 키는 아버지가 가지고 있는 키의 자료형과 동일하게 사용해야 한다.
  3. 아버지가 UNIQUE한 값을 갖는 키들만, 아들이 가져가서 참조할 수 있다.

******************************************************************************



<< 에러 상황 예제>>

흠... 일단 내가 맞딱드렸던 ,에러 상황을 살펴보자.
******************************************************************************
# 아버지 테이블 : 유니크한 키값을 갖는다.
CREATE TABLE father (
 id INT UNSIGNED COMMENT 'father 테이블의 유니크한 키',
 UNIQUE KEY test_id_idx (id)
)ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT='자식을 가질 아버지 테이블';

# 나쁜 아들 테이블 : 테이블 생성이 되지 않는다.
CREATE TABLE bad_son1 (
 father_id INT COMMENT 'father 테이블의 id를 FK로 하는 id',
 CONSTRAINT son_father_id_fk FOREIGN KEY (father_id) REFERENCES father(id)
)ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT='아들, 이녀석은 UNSIGNED를 안 써서 errno:150을 뿌린다';

# 착한 딸 테이블 : 테이블의 정상적인 생성이 이루어진다.
CREATE TABLE good_daughter (
 father_id INT UNSIGNED COMMENT 'father 테이블의 id를 FK로 하는 id',
 CONSTRAINT good_daughter_father_id_fk FOREIGN KEY (father_id) REFERENCES father(id)
)ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT='딸, 얘는 아버지를 쏙 빼다 닮아서 정상적으로 생성된다.';
******************************************************************************



<< 수행결과 >>

mysql> # 아버지 테이블 : 유니크한 키값을 갖는다.
mysql> CREATE TABLE father (
    ->  id INT UNSIGNED COMMENT 'father 테이블의 유니크한 키',
    ->  UNIQUE KEY test_id_idx (id)
    -> )ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT='자식을 가질 아버지 테이블';
Query OK, 0 rows affected (0.09 sec)

mysql> # 나쁜 아들 테이블 : 테이블 생성이 되지 않는다.
mysql> CREATE TABLE bad_son1 (
    ->  father_id INT COMMENT 'father 테이블의 id를 FK로 하는 id',
    ->  CONSTRAINT son_father_id_fk FOREIGN KEY (father_id) REFERENCES father(id)
    -> )ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT='아들, 이녀석은 UNSIGNED를 안 써서 errno:150을 뿌린다';
ERROR 1005 (HY000): Can't create table 'test2.bad_son1' (errno: 150)

mysql> # 착한 딸 테이블 : 테이블의 정상적인 생성이 이루어진다.
mysql> CREATE TABLE good_daughter (
    ->  father_id INT UNSIGNED COMMENT 'father 테이블의 id를 FK로 하는 id',
    ->  CONSTRAINT good_daughter_father_id_fk FOREIGN KEY (father_id) REFERENCES father(id)
    -> )ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT='딸, 얘는 아버지를 쏙 빼다 닮아서 정상적으로 생성된다.';
Query OK, 0 rows affected (0.11 sec)


아들이 왜 삑사리가 났는가?
아버지와 동일한 형태의 자료형을 사용하지 않았기 때문이다.

LINK3의 맨 마지막 글과 동일한 상황이었던, 은연중에 사용했던 UNSIGNED 가 문제가 되었던 것...


<< 정리 및 해법>>
자.. 정리하자.

일단, errno:150 이 나타났다면,
그것은 FOREIGN KEY를 생성하는 구문에 문제가 있음을 의미하며,
위에 언급했던 3가지 (INNODB, 자료형, 유니크 키) 를 반드시 확인해 보도록 하자.

그 때도 해결이 안된다면, 위의 링크들을 다시 한 번 꼼꼼히 살펴보도록 한다.
TRACKBACK 1 AND COMMENT 7
  1. 호이루 2009.01.14 15:28 address edit/delete reply

    갑자기..또 FOREIGN KEY 에 대한 귀찮은 느낌이...써야 한다는건 들었지만 ㅋ

    나 계속 too many connection 이 뜨는 오류 발생...매일마다...한번씩....아침마다........
    왜그럴까...........ㅠ

    • 까망별 음머어 2009.01.14 19:14 신고 address edit/delete

      만약 MySQL설정에 의한 것이 원인이라면, 환경변수인max_connection 뭐시기를 조정해야지...
      하지만, 그건 자네 권한 밖의 이야기이공...
      어딘지만 말해 들어가서 살펴봐줄껭

  2. 카스파르 2009.09.03 09:08 address edit/delete reply

    좋은내용 잘 보고 갑니다.
    가끔 문자 인코딩이 안맞는 경우에도 저런 오류가 발생합니다.
    테이블 인코딩을 맞춰주면 해결되더군요.^^

    • 까망별 음머어 2009.09.14 16:55 신고 address edit/delete

      아~ 인코딩 문제로도 저런 문제가 발생할 수 있겠군요...

      좋은 정보 감사드립니다 (_ _)

  3. 2010.06.04 16:09 address edit/delete reply

    감사합니다 ㅎㅎ

  4. 2012.01.17 15:56 address edit/delete reply

    비밀댓글입니다

  5. 승용 2012.12.21 11:23 address edit/delete reply

    지금 이문제 때문에 오류로 스트레스 발생 중 인데...
    비슷한거 같기는 한데...
    해결이 안되고 있네요..
    좋은 자료 잘보고 갑니다.(자료점 퍼갈게요.)





ARTICLE CATEGORY

모든 이야기 (77)
독백 (22)
MySQL (25)
Oracle (7)
영화 (6)
Linux (3)
DW(Data Warehouse) (0)
(7)
음악 (1)
Python (3)
Postgresql (2)

ARCHIVE