LỖI: Lỗi 1005: Không thể tạo bảng (errno: 121)


108

Tôi gặp sự cố với forward engineeringcơ sở dữ liệu MySQL của mình vào máy chủ WAMP .. Tôi đã định đăng một hình ảnh của lược đồ nhưng vì đây là bài đăng đầu tiên của tôi nên tôi không thể.

Dưới đây là tập lệnh đã thực thi ..

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;

Nhưng sau đó tôi gặp lỗi này:

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

Tôi không thể hiểu tại sao. Ai giúp tôi với?


2
Nếu bạn có quyền quản trị trên máy chủ, bạn có thể muốn bắt đầu bằng cách chạy lệnh MySQL “SHOW INNODB STATUS” (hoặc MySQL 5.5 “SHOW ENGINE INNODB STATUS”) ngay sau khi nhận được lỗi. Lệnh này hiển thị thông tin nhật ký và chi tiết lỗi. Từ đó, bạn có thể thấy nó sai ở đâu
Dorvalla 27/09/12

1
Câu trả lời của @Dorvalla đã giải quyết được vấn đề đó. Trên thực tế, nhật ký lỗi chi tiết được lưu trữ trong LATEST FOREIGN KEY ERRORphần của statuscột khi bạn chạy lệnh trạng thái INNODB.
Devy

Câu trả lời:


237

Tôi đã nhanh chóng tìm kiếm bạn, và nó đã đưa tôi đến đây . Tôi trích dẫn:

Bạn sẽ nhận được thông báo này nếu bạn đang cố thêm một ràng buộc với một tên đã được sử dụng ở một nơi khác

Để kiểm tra các ràng buộc, hãy sử dụng truy vấn SQL sau:

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

Tìm kiếm thêm thông tin ở đó hoặc thử xem lỗi xảy ra ở đâu. Có vẻ như tôi gặp sự cố với khóa ngoại.


Câu trả lời này là tốt nhất cho đến nay .. cảm ơn .. vì vậy điều gì đã nảy ra là có 3 ràng buộc, 2 trong số đó giống nhau ... nhưng những cái giống nhau đến từ một bảng tôi đã xóa trước đó? Vậy tôi phải làm gì?
user1703514

1
Hãy thử chuỗi này Hãy thử xóa ràng buộc, nếu không bạn sẽ thay đổi nó. Tôi không chắc làm thế nào, vì tôi không quen thuộc với nó, nhưng có vẻ hợp lý nếu bạn có thể gọi ra các ràng buộc, bạn cũng có thể xóa chúng hoặc thay đổi chúng.
Dorvalla

Phổ biến nhất là bạn đang cố gắng sử dụng cùng một tên khóa ngoại hai lần!
Harm

26

Tên ràng buộc khóa nước ngoài phải là duy nhất trong cơ sở dữ liệu

Cả câu trả lời của @ Dorvallabài đăng trên blog này được đề cập ở trên đều chỉ cho tôi hướng đi đúng để khắc phục sự cố cho bản thân; trích dẫn từ sau:

Nếu bảng bạn đang cố gắng tạo bao gồm một ràng buộc khóa ngoại và bạn đã cung cấp tên riêng của mình cho ràng buộc đó, hãy nhớ rằng nó phải là duy nhất trong cơ sở dữ liệu.

Tôi đã không nhận thức được điều đó. Tôi đã thay đổi tên ràng buộc khóa ngoại của mình theo lược đồ sau dường như cũng được các ứng dụng Ruby on Rails sử dụng:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

Link_lession_id_fkdụ, đối với bảng OP, đây sẽ là một ví dụ.


6

Bạn có thể đăng nhập vào mysql và gõ

mysql> SHOW INNODB STATUS\G

Bạn sẽ có tất cả đầu ra và bạn nên biết rõ hơn lỗi là gì.


1
Trong MySQL 5.5, nó SHOW ENGINE INNODB STATUS. Và nó phải được chạy ngay sau khi gặp lỗi để lấy thông tin liên quan.
Devy

2

Nếu bạn có định nghĩa khóa ngoại trong một số bảng và tên của khóa ngoại được sử dụng ở nơi khác làm khóa ngoại khác, bạn sẽ gặp lỗi này.


2

Tôi gặp phải lỗi này (lỗi 121) nhưng nguyên nhân là do các bảng trung gian do mysql tạo đã bị lỗi, ngăn tôi thay đổi bảng mặc dù không có tên ràng buộc nào như vậy tồn tại trên bất kỳ bảng nào của tôi. Tại một số thời điểm, MySQL của tôi đã gặp sự cố hoặc không thể dọn dẹp một bảng trung gian (tên bảng bắt đầu bằng # sql-), kết quả là tôi gặp lỗi như: Không thể tạo bảng '# sql-' (errno 121) khi cố gắng chạy ALTER TABLE với các tên ràng buộc nhất định.

Theo tài liệu tại http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html , bạn có thể tìm kiếm các bảng mồ côi này bằng:

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

Phiên bản tôi đang làm việc là 5.1, nhưng lệnh trên chỉ hoạt động trên các phiên bản> = 5.6 (hướng dẫn sử dụng không chính xác về nó hoạt động cho 5.5 hoặc cũ hơn, vì INNODB_SYS_TABLES không tồn tại trong các phiên bản như vậy). Tôi có thể tìm thấy bảng tạm thời bị mất tích (không khớp với bảng có tên trong thư) bằng cách tìm kiếm thư mục dữ liệu mysql của tôi trong dòng lệnh:

find . -iname '#*'

Sau khi phát hiện ra tên tệp, chẳng hạn như # sql-9ad_15.frm, tôi có thể xóa bảng mồ côi đó trong MySQL:

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

Sau khi làm như vậy, tôi đã có thể chạy thành công ALTER TABLE của mình.

Để hoàn thiện, theo tài liệu MySQL được liên kết, "tiền tố # mysql50 # cho MySQL biết bỏ qua mã hóa an toàn tên tệp được giới thiệu trong MySQL 5.1."


1

Nếu bạn muốn khắc phục nhanh chóng, hãy Forward Engineer một lần nữa và đánh dấu vào tùy chọn "Generate DROP SCHEMA" và tiến hành.

Tôi giả sử cơ sở dữ liệu không chứa dữ liệu, vì vậy việc giảm nó sẽ không ảnh hưởng.


0

Một điều tôi nhận thấy là tôi có "other_database" và "Other_Database" trong cơ sở dữ liệu của mình. Điều đó gây ra sự cố này vì tôi thực sự có cùng một tham chiếu trong cơ sở dữ liệu khác gây ra lỗi bí ẩn này!


-3
mysql> SHOW ENGINE INNODB STATUS;

Nhưng trong trường hợp của tôi chỉ có cách này mới có thể giúp được:
1. Sao lưu DB hiện tại
2. Bỏ DB (không phải tất cả các bảng, trừ DB)
3. Tạo DB (kiểm tra xem bạn vẫn còn các đặc quyền)
4. Khôi phục DB từ bản sao lưu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.