ข้อผิดพลาด: ข้อผิดพลาด 1005: ไม่สามารถสร้างตารางได้ (ข้อผิดพลาด: 121)


108

ฉันมีปัญหากับforward engineeringฐานข้อมูล MySQL ของฉันในเซิร์ฟเวอร์ 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”) ทันทีหลังจากได้รับข้อผิดพลาด คำสั่งนี้แสดงข้อมูลบันทึกและรายละเอียดข้อผิดพลาด จากตรงนั้นคุณจะเห็นว่าผิดพลาด
ตรงไหน

1
คำตอบของ @Dorvalla แก้ไขได้ ในความเป็นจริงบันทึกข้อผิดพลาดโดยละเอียดจะถูกเก็บไว้ในLATEST FOREIGN KEY ERRORส่วนของstatusคอลัมน์เมื่อคุณเรียกใช้คำสั่งสถานะ INNODB
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

โดยทั่วไปคุณพยายามใช้ชื่อ Foreign Key เดียวกันสองครั้ง!
อันตราย

26

ชื่อ Foreign Key Constraint ต้องไม่ซ้ำกันภายในฐานข้อมูล

ทั้งคำตอบของ @ 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 เท่านั้น (คู่มือไม่ถูกต้องเกี่ยวกับเวอร์ชันที่ใช้งานได้กับ 5.5 หรือก่อนหน้าเนื่องจากไม่มี INNODB_SYS_TABLES ในเวอร์ชันดังกล่าว) ฉันสามารถค้นหาตารางชั่วคราวที่ไม่มีเจ้าของ (ซึ่งไม่ตรงกับตารางที่ระบุในข้อความ) โดยค้นหาไดเร็กทอรีข้อมูล 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

หากคุณต้องการแก้ไขอย่างรวดเร็วให้ส่งต่อวิศวกรอีกครั้งและเลือกตัวเลือก "Generate DROP SCHEMA" และดำเนินการต่อ

ฉันถือว่าฐานข้อมูลไม่มีข้อมูลดังนั้นการทิ้งจะไม่มีผล


0

สิ่งที่ฉันสังเกตเห็นคือฉันมี "other_database" และ "Other_Database" ในฐานข้อมูลของฉัน นั่นทำให้เกิดปัญหานี้เนื่องจากฉันมีการอ้างอิงเดียวกันในฐานข้อมูลอื่นซึ่งทำให้เกิดข้อผิดพลาดลึกลับนี้!


-3
mysql> SHOW ENGINE INNODB STATUS;

แต่ในกรณีของฉันวิธีนี้เท่านั้นที่จะช่วยได้:
1. ทำการสำรองฐานข้อมูลปัจจุบัน
2. วางฐานข้อมูล (ไม่ใช่ทุกตาราง แต่เป็นฐานข้อมูล)
3. สร้างฐานข้อมูล (ตรวจสอบว่าคุณยังมีค่าที่เหนือกว่า)
4. เรียกคืนฐานข้อมูลจากการสำรองข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.