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

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)

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



답변

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

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

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

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

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


답변

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

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

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

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

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

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


답변

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

mysql> SHOW INNODB STATUS\G

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


답변

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


답변

이 오류 (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에 도입 된 파일 이름 안전 인코딩을 무시하도록 지시합니다.”


답변

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

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


답변

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