오류 : 오류 1005 : 테이블을 만들 수 없습니다 (errno : 121).


108

forward engineeringMySQL 데이터베이스에 WAMP 서버에 문제가 있습니다 . 스키마 이미지를 게시하려고했지만 이것이 내 첫 번째 게시물이므로 할 수 없습니다.

아래는 실행 된 스크립트입니다 ..

use aquaticstar;

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Table `Students`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Students` ;

CREATE  TABLE IF NOT EXISTS `Students` (
  `id` VARCHAR(10) NOT NULL ,
  `studentName` VARCHAR(45) NOT NULL ,
  `gender` CHAR NOT NULL ,
  `birthDate` DATETIME NOT NULL ,
  `mNo` VARCHAR(10) NOT NULL ,
  `contactName` VARCHAR(45) NOT NULL ,
  `contactEmail` VARCHAR(45) NOT NULL ,
  `contactPhone` INT(10) NOT NULL ,
  `startDate` DATETIME NOT NULL ,
  `remarks` VARCHAR(200) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Waiting List`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Waiting List` ;

CREATE  TABLE IF NOT EXISTS `Waiting List` (
  `wait_id` VARCHAR(5) NOT NULL ,
  `name` VARCHAR(45) NULL ,
  `contactName` VARCHAR(45) NULL ,
  `contactPhone` INT(10) NULL ,
  `contactEmail` VARCHAR(45) NULL ,
  `status` CHAR NULL ,
  `remarks` VARCHAR(200) NULL ,
  PRIMARY KEY (`wait_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Schedule`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Schedule` ;

CREATE  TABLE IF NOT EXISTS `Schedule` (
  `lesson_id` VARCHAR(10) NOT NULL ,
  `day` VARCHAR(3) NOT NULL ,
  `branch` VARCHAR(30) NOT NULL ,
  `level` VARCHAR(30) NOT NULL ,
  `time` TIME NOT NULL ,
  `ae` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`lesson_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Link`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Link` ;

CREATE  TABLE IF NOT EXISTS `Link` (
  `link_id` VARCHAR(10) NOT NULL ,
  `id` VARCHAR(10) NOT NULL ,
  `lesson_id` VARCHAR(10) NOT NULL ,
  PRIMARY KEY (`link_id`) ,
  INDEX `id_idx` (`id` ASC) ,
  INDEX `lesson_id_idx` (`lesson_id` ASC) ,
  CONSTRAINT `id`
    FOREIGN KEY (`id` )
    REFERENCES `Students` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `lesson_id`
    FOREIGN KEY (`lesson_id` )
    REFERENCES `Schedule` (`lesson_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Attendance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Attendance` ;

CREATE  TABLE IF NOT EXISTS `Attendance` (
  `date` DATETIME NOT NULL ,
  `attendance` VARCHAR(5) NOT NULL ,
  `link_id` VARCHAR(10) NOT NULL ,
  INDEX `link_id_idx` (`link_id` ASC) ,
  CONSTRAINT `link_id`
    FOREIGN KEY (`link_id` )
    REFERENCES `Link` (`link_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

-- -----------------------------------------------------
-- Data for table `Students`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s001', 'Sam Khew', 'm', '12/12/1991', 'nm', 'May Khew', 'may@gmail.com', 0198829387, '12/07/2011', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s002', 'Joe Biden', 'm', '13/03/2003', 'nm', 'Layla Biden', 'layla@gmail.com', 0199283763, '14/05/2011', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s003', 'Bob Builder', 'm', '14/02/2002', 'LK920K', 'Mama Builder', 'mama@yahoo.com', 0167728376, '29/02/2012', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s004', 'Kenny Koh', 'm', '18/02/1999', 'MM992', 'Lisa Koh', 'lk@hotmail.com', 0123160231, '19/01/2012', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s005', 'Jane Doe', 'f', '29/09/1999', 'nm', 'Jackie Doe', 'jackied@gmail.com', 0127736254, '02/03/2012', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s006', 'Lola Lai', 'f', '02/05/2004', 'nm', 'Mark Lai', 'mark@gmail.com', 0198827365, '11/09/2011', NULL);

COMMIT;

-- -----------------------------------------------------
-- Data for table `Schedule`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat1_s4', 'Sat', 'Sunway', 'basic', '4pm', 'Aini');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat1_s5', 'Sat', 'Sunway', 'basic', '5pm', 'Aini');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat1_s6', 'Sat', 'Sunway', 'basic', '6pm', 'Aini');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat2_s4', 'Sat', 'Sunway', 'advance', '4pm', 'Nina');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat2_s5', 'Sat', 'Sunway', 'advance', '5pm', 'Nina');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat3_s6', 'Sat', 'Sunway', 'pre-comp', '6pm', 'Marcus');

COMMIT;

-- -----------------------------------------------------
-- Data for table `Link`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L001', 's001', 'sat1_s4');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L002', 's002', 'sat1_s5');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L003', 's003', 'sat1_s6');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L004', 's004', 'sat2_s4');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L005', 's005', 'sat1_s5');

COMMIT;

-- -----------------------------------------------------
-- Data for table `Attendance`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Attendance` (`date`, `attendance`, `link_id`) VALUES ('26/9/2012', '1', NULL);

COMMIT;

하지만 다음 오류가 발생합니다.

Executing SQL script in server
ERROR: Error 1005: Can't create table 'aquaticstar.link' (errno: 121)

이유를 알 수 없습니다. 누구든지 나를 도울 수 있습니까?


2
서버에 대한 관리자 권한이있는 경우 오류를 수신 한 직후 MySQL 명령 "SHOW INNODB STATUS"(또는 MySQL 5.5 "SHOW ENGINE INNODB STATUS")를 실행하여 시작할 수 있습니다. 이 명령은 로그 정보 및 오류 세부 정보를 표시합니다. 거기에서 어디에서 잘못되었는지 볼 수 있습니다
Dorvalla

1
@Dorvalla의 대답이 해결되었습니다. 사실, 세부 오류 로그는 INNODB status 명령을 실행할 때 열 LATEST FOREIGN KEY ERROR섹션에 저장됩니다 status.
Devy

답변:


237

빨리 당신을 찾아서 여기로 데려 왔습니다 . 나는 인용한다 :

이미 다른 곳에서 사용 된 이름으로 제약 조건을 추가하려는 경우이 메시지가 표시됩니다.

제약 조건을 확인하려면 다음 SQL 쿼리를 사용하십시오.

SELECT
    constraint_name,
    table_name
FROM
    information_schema.table_constraints
WHERE
    constraint_type = 'FOREIGN KEY'
AND table_schema = DATABASE()
ORDER BY
    constraint_name;

여기에서 자세한 정보를 찾거나 오류가 발생한 위치를 확인하십시오. 나에게 외래 키에 문제가있는 것 같습니다.


이 대답은 지금까지 최고였습니다 .. 감사합니다 .. 그래서 나온 것은 3 개의 제약이 있었는데, 그 중 2 개는 똑같습니다 ... 그런데 같은 것들은 제가 이전에 삭제 한 테이블에서 나온 것입니까? 그래서 나는 무엇을합니까?
user1703514

1
이 스레드 시도 제한을 삭제하십시오. 그렇지 않으면 변경하십시오. 나는 그것에 익숙하지 않기 때문에 어떻게 해야할지 모르겠지만, 제약 조건을 불러 낼 수 있다면 논리적으로 보일 것입니다. 당신도 그것들을 삭제하거나 변경할 수 있습니다.
Dorvalla

가장 일반적으로 동일한 외래 키 이름을 두 번 사용하려고합니다!
Harm

26

외래 키 제약 이름은 ​​데이터베이스 내에서 고유해야합니다.

Dorvalla의 대답 @ 그리고 이 블로그 게시물 자신을 위해 문제를 해결하기 위해 올바른 방향으로 지적 저 위에서 언급 한; 후자의 인용 :

생성하려는 테이블에 외래 키 제약 조건이 포함되어 있고 해당 제약 조건에 대한 고유 한 이름을 제공 한 경우 데이터베이스 내에서 고유해야합니다.

나는 그것을 몰랐다. Ruby on Rails 애플리케이션에서도 사용되는 것으로 보이는 다음 스키마에 따라 외래 키 제약 조건 이름을 변경했습니다.

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

예를 들어 OP 테이블의 경우 이것은입니다 Link_lession_id_fk.


6

mysql에 로그인하고 다음을 입력 할 수 있습니다.

mysql> SHOW INNODB STATUS\G

모든 출력을 얻을 수 있으며 오류가 무엇인지 더 잘 알 수 있습니다.


1
MySQL 5.5에서는 SHOW ENGINE INNODB STATUS. 그리고 관련 정보를 얻으려면 오류가 발생한 직후에 실행해야합니다.
Devy

2

일부 테이블에 외래 키 정의가 있고 외래 키의 이름이 다른 외래 키로 다른 곳에서 사용되는 경우이 오류가 발생합니다.


2

이 오류 (errno 121)에 직면했지만 mysql이 생성 한 중간 테이블이 고아가되어 발생하여 테이블에 제약 이름이없는 경우에도 테이블을 변경할 수 없습니다. 어느 시점에서 내 MySQL이 충돌하거나 중간 테이블 (# sql-로 시작하는 테이블 이름)을 정리하지 못하여 다음과 같은 오류가 표시되었습니다. '# sql-'테이블을 만들 수 없습니다 (errno 121). 특정 제약 이름으로 ALTER TABLE을 실행하려고 할 때.

http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html 의 문서에 따르면 다음을 사용하여 이러한 고아 테이블을 검색 할 수 있습니다.

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';

내가 작업 한 버전은 5.1 이었지만 위의 명령은 버전> = 5.6에서만 작동합니다 (INNODB_SYS_TABLES가 그러한 버전에 존재하지 않기 때문에 5.5 이전 버전에서 작동하는 것에 대해서는 수동이 올바르지 않습니다). 명령 줄에서 mysql 데이터 디렉토리를 검색하여 고아 임시 테이블 (메시지에 이름이 지정된 것과 일치하지 않음)을 찾을 수있었습니다.

find . -iname '#*'

# sql-9ad_15.frm과 같은 파일 이름을 찾은 후 MySQL에서 분리 된 테이블을 삭제할 수있었습니다.

USE myschema;
DROP TABLE `#mysql50##sql-9ad_15`;

그런 다음 ALTER TABLE을 성공적으로 실행할 수있었습니다.

완전성을 위해 링크 된 MySQL 문서에 따르면 "# mysql50 # 접두사는 MySQL이 MySQL 5.1에 도입 된 파일 이름 안전 인코딩을 무시하도록 지시합니다."


1

빠르게 수정하려면 엔지니어를 다시 전달하고 "DROP SCHEMA 생성"옵션을 선택하고 계속 진행하십시오.

데이터베이스에 데이터가 포함되어 있지 않다고 가정하므로 삭제해도 영향을 미치지 않습니다.


0

내가 알아 차린 것은 데이터베이스에 "other_database"와 "Other_Database"가 있다는 것입니다. 이 신비한 오류를 일으킨 다른 데이터베이스에서 실제로 동일한 참조가 있었기 때문에이 문제가 발생했습니다!


-3
mysql> SHOW ENGINE INNODB STATUS;

하지만 제 경우에는이 방법 만이 도움이 될 수 있습니다 :
1. 현재 DB의 백업 만들기
2. DB 삭제 (모든 테이블이 아니라 DB)
3. DB 만들기 (여전히 권한이 있는지 확인)
4. 백업에서 DB 복원

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.