错误:错误1005:无法创build表(errno:121)

我正在麻烦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) 

我无法弄清楚为什么。 任何人都可以帮我吗?

我为你迅速搜寻,它把我带到了这里 。 我引用:

如果您试图添加一个已经在其他地方使用的名称的约束,您将会收到此消息

要检查约束,请使用以下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的回答和上面提到的这个博客指出了我为自己解决问题的正确方向; 从后者引用:

如果您要创build的表包含外键约束,并且您已为该约束提供了自己的名称,请记住它在数据库中必须是唯一的。

我没有意识到这一点。 我已经根据以下架构更改了我的外键约束名称,该架构似乎也被Ruby on Rails应用程序使用:

 <TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk 

例如,OP的表格就是Link_lession_id_fk

你可以login到MySQL并键入

 mysql> SHOW INNODB STATUS\G 

你将得到所有的输出,你应该对错误是什么有更好的了解。

如果你在某个表中有一个外键定义,并且这个外键的名字在其他地方被用作另一个外键,你将会有这个错误。

如果要快速修复,请再次转发工程师并选中“生成DROP SCHEMA”选项并继续。

我假设数据库不包含数据,所以删除它不会影响。

我遇到了这个错误(errno 121),但它是由mysql创build的孤立的中间表引起的,即使在我的表中没有这样的约束名,也不能改变表。 在某些时候,我的MySQL已经崩溃或无法清理中间表(表名以#sql-开头),最终呈现给我一个错误,如:无法创build表'#sql-'(errno 121)当试图运行具有特定约束名称的ALTER TABLE时。

根据http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html上的文档,您可以使用以下方式search这些孤立表:;

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

我使用的版本是5.1,但上面的命令只适用于版本> = 5.6(对于5.5或更低版本,手动版本不正确,因为INNODB_SYS_TABLES在这些版本中不存在)。 我能够通过在命令行中search我的mysql数据目录find孤立的临时表(它与消息中指定的表不匹配):

 find . -iname '#*' 

发现文件名后,例如#sql-9ad_15.frm,我可以在MySQL中删除那个孤立的表:

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

这样做后,我能够成功地运行我的ALTER TABLE。

为了完整性,根据链接的MySQL文档,“#mysql50#前缀告诉MySQL忽略在MySQL 5.1中引入的文件名安全编码”。

我注意到的是,我的数据库中有“other_database”和“Other_Database”。 这导致了这个问题,因为我在其他数据库中引起了这个神秘的错误实际上有相同的参考!

 mysql> SHOW ENGINE INNODB STATUS; 

但在我的情况下,只有这样可以帮助:
1.备份当前的数据库
2.删除DB(不是所有表,但DB)
3.创build数据库(检查你是否还有优先权)
4.从备份中恢复数据库