errno 121

어딘가에서 이미 사용하고 있는 CONSTRAINT를 더하려고 할 때 나타난다


===================================================================================


일전에 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, 자료형, 유니크 키) 를 반드시 확인해 보도록 하자.

그 때도 해결이 안된다면, 위의 링크들을 다시 한 번 꼼꼼히 살펴보도록 한다.

출처 - http://blackbull.tistory.com/54

===================================================================================


ERROR 1452 : Cannot add or update a child row (a foreign key constraint fails)

 

외래 키(Foreign Key) 필드에 값을 삽입하거나 수정하려 할 때, 외래 키가 참조하는 주 키(Primary Key)에서 사용하는 값 이외의 값이 들어가면 이 에러를 반환한다.

이 때는 주 키에 속한 값으로 외래 키를 수정하거나 삽입해야 한다.


출처 - http://blog.naver.com/PostView.nhn?blogId=silverburgh&logNo=70105333778&viewDate=&currentPage=1&listtype=0











Posted by linuxism
,