Подтвердить что ты не робот

ОШИБКА: Ошибка 1005: невозможно создать таблицу (errno: 121)

У меня возникли проблемы с forward engineering моей базой данных MySQL на сервере WAMP. Я собирался опубликовать образ схемы, но поскольку это мой первый пост, я не могу.

Ниже приведен выполненный script..

use aquaticstar;

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@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 [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_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', '[email protected]', 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', '[email protected]', 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', '[email protected]', 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', '[email protected]', 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', '[email protected]', 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', '[email protected]', 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)

Я не могу понять, почему. Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

Я быстро искал для вас, и это принесло мне здесь. Я цитирую:

Вы получите это сообщение, если вы пытаетесь добавить ограничение с помощью имя, которое уже использовалось где-то еще

Чтобы проверить ограничения, используйте следующий SQL-запрос:

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

Ищите дополнительную информацию там или попытайтесь увидеть, где происходит ошибка. Похож на проблему с внешним ключом для меня.

Ответ 2

Имена ограничений внешнего ключа должны быть уникальными в базе данных

Оба @Dorvallas answer и этот пост в блоге, упомянутый выше, указал мне на правильное направление для решения проблемы для себя; цитируя из последнего:

Если таблица, которую вы пытаетесь создать, включает ограничение внешнего ключа, и вы указали свое собственное имя для этого ограничения, помните, что он должен быть уникальным в базе данных.

Я не знал об этом. Я изменил имена ограничений внешнего ключа в соответствии со следующей схемой, которая, как представляется, также используется приложениями Ruby on Rails:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

Для таблицы OPs это будет Link_lession_id_fk, например.

Ответ 3

Вы можете войти в mysql и ввести

mysql> SHOW INNODB STATUS\G

У вас будет весь вывод, и вы должны лучше понять, что такое ошибка.

Ответ 4

Если у вас есть определение внешнего ключа в некоторой таблице, а имя внешнего ключа используется в другом месте как другой внешний ключ, у вас будет эта ошибка.

Ответ 5

Если вы хотите быстро исправить ошибку, Forward Engineer снова и установите опцию "Создать DROP SCHEMA" и продолжите.

Я предполагаю, что база данных не содержит данных, поэтому ее отбрасывание не повлияет.

Ответ 6

Я столкнулся с этой ошибкой (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".

Ответ 7

Что-то, что я заметил, было то, что у меня были "other_database" и "Other_Database" в моих базах данных. Это вызвало эту проблему, поскольку у меня на самом деле была такая же ссылка в другой базе данных, которая вызвала эту таинственную ошибку!

Ответ 8

mysql> SHOW ENGINE INNODB STATUS;

Но в моем случае только такой способ мог помочь:
1. Сделайте резервную копию текущего БД
2. Drop DB (не все таблицы, но DB)
3. Создайте БД (убедитесь, что у вас все еще есть прелюдии)
4. Восстановить БД из резервной копии