errno: 121

1. 버전
1) 운영 체제
 cat/etc/issue cat/etc/issue CentOS release 6.6 (Final) Kernel\r on an\m
 cat/proc/version cat/proc/version Linux version 2.6.32-504.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014
2) mysql 데이터베이스 버전
mysql --version mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
2. 문제 설명
2.1 문제점 발견
오늘 다음 오류를 보고하는 mysql 라이브러리 아래에 테이블을 만듭니다.
ERROR 1005 (HY000): Can't create table 'log.test6' (errno: 121)
건표문은 다음과 같다.
CREATE TABLE `test6` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `user_id` int(11) NOT NULL,
 CONSTRAINT `FK_TEST_ID` FOREIGN KEY (`id`) REFERENCES `test3` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. 문제 분석
3.1 상부의 오보를 통해 우리는 어떤 원인이 건표문구의 오보를 초래했는지 알 수 없다.운영 체제에서 perror를 사용하여 121 오류 코드에 대한 정보를 확인할 수 있습니다.
perror 121
OS error code 121:  Remote I/O error
MySQL error code 121: Duplicate key on write or update
상단perror121에서 출력한 정보(Duplicate key)를 통해 우리는 문제의 원인을 대충 판단할 수 있다.외부 키 이름 (대소문자를 구분하지 않음) 이 중복되어 발생한 것이어야 한다. (우리가 지정한 색인 이름은 중복될 수 있기 때문이다.)
3.2 우리의 판단을 검증한다
1) 테스트 3 테이블 만들기
CREATE TABLE test3 (
  id int(11) DEFAULT NULL,
  name varchar(20) DEFAULT '0',
  KEY  (id)) engine=innodb;
2)test4표 만들기(외키 제약 만들기)
CREATE TABLE `test4` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(100) NOT NULL,
 `user_id` int(11) NOT NULL,
 CONSTRAINT `FK_TEST_ID` FOREIGN KEY (`id`) REFERENCES `test3` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3)test5 테이블을 만들고 겹쳐쓰기 FKTEST_ID
CREATE TABLE `test5` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(100) NOT NULL,
 `user_id` int(11) NOT NULL,
 CONSTRAINT `FK_TEST_ID` FOREIGN KEY (`id`) REFERENCES `test3` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ERROR 1005 (HY000): Can't create table 'log.test5' (errno: 121)
4) 테이블 작성 후 외부 키 추가
CREATE TABLE `test5` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(100) NOT NULL,
 `user_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table test5 add constraint FK_TEST_ID foreign key(id) REFERENCES test3(id);
ERROR 1005 (HY000): Can't create table 'log.#sql-2a43_e91' (errno: 121)

위에는 5.1.73에 실린 오타가 있는데 같은 장면은 5.6에 실린 오타가 다음과 같다.
alter 외부 키를 추가하는 중 이름이 잘못되었습니다. 아래와 같습니다.
ERROR 1022 (23000): Can't write; duplicate key in table '#sql-1106_10'
create가 테이블을 만들 때 지정한 외부 키가 겹치면 다음과 같이 오류가 발생합니다.
ERROR 1022 (23000): Can't write; duplicate key in table 'test6'
##5.6의 오타가 5.1의 오타보다 읽기 쉽다는 것을 알 수 있다.위의 테스트는 우리의 판단을 검증했다.(innodb표에만 적용되며, 외부 키로 적용되는 열은 색인을 만들어야 합니다.)
참조된 외부 키 열에 색인이 없으면 외부 키를 만들 때 5.1과 5.6에 각각 다음과 같은 오류가 표시됩니다.
5.1 다음과 같은 오류 보고
ERROR 1005 (HY000): Can't create table 'test.test4' (errno: 150)
5.6 다음과 같은 오류를 보고한다.
ERROR 1215 (HY000): Cannot add foreign key constraint
4. 솔루션
다른 키 이름을 지정합니다. (대소문자를 구분하지 않으면 abc와 ABC가 중복된 것으로 간주됩니다.)

좋은 웹페이지 즐겨찾기