ОШИБКА: Ошибка 1005: невозможно создать таблицу (errno: 121)
У меня проблемы с forward engineering
моей базы данных MySQL в WAMP-сервер. Я собирался опубликовать образ схемы, но поскольку это мой первый пост, я не могу.
Ниже приведен скрипт.
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;
Но затем я получаю эту ошибку:
- 'Доступ запрещен для пользователя' root '@' localhost '(с использованием пароля: НЕТ)'
- Получение числа строк, вставленных в ON DUPLICATE KEY UPDATE с несколькими вставками?
- Как подсчитать все строки при использовании SELECT с LIMIT в запросе MySQL?
- Получение связанного списка в базе данных MySQL
- Как заставить MySQL правильно обрабатывать UTF-8
Executing SQL script in server ERROR: Error 1005: Can't create table 'aquaticstar.link' (errno: 121)
Я не могу понять, почему. Может кто-нибудь мне помочь?
- Как я могу подключиться к MySQL в Python 3 в Windows?
- Потоковая обработка больших наборов результатов с помощью MySQL
- Как добавить предложение where в инструкции MySQL Insert?
- Подавлять предупреждения с помощью mysql из терминала, но пароль написан в сценарии bash
- Как сделать резервную копию одной таблицы в базе данных MySQL?
- Создание дерева на основе глубины из иерархических данных в MySQL (без CTE)
- Как сохранить вывод запроса MySQL в файл excel или .txt?
- Как избежать специальных символов в MySQL?
Я быстро искал для вас, и это привело меня сюда . Я цитирую:
Вы получите это сообщение, если пытаетесь добавить ограничение с именем, которое уже используется где-то в другом месте
Чтобы проверить ограничения, используйте следующий SQL-запрос:
SELECT constraint_name, table_name FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY' AND table_schema = DATABASE() ORDER BY constraint_name;
Найдите дополнительную информацию или попробуйте увидеть, где происходит ошибка. Похож на проблему с иностранным ключом для меня.
Имена ограничений внешнего ключа должны быть уникальными в пределах базы данных
Как ответ Дорваллы, так и упомянутое выше сообщение в блоге указывали мне в правильном направлении, чтобы решить проблему для себя; цитируя из последнего:
Если таблица, которую вы пытаетесь создать, включает ограничение внешнего ключа, и вы указали свое собственное имя для этого ограничения, помните, что он должен быть уникальным в базе данных.
Я не знал об этом. Я изменил имена ограничений внешнего ключа в соответствии со следующей схемой, которая, как представляется, также используется приложениями Ruby on Rails:
__fk
Например, для таблицы OP это будет Link_lession_id_fk
.
Вы можете войти в mysql и ввести
mysql> SHOW INNODB STATUS\G
У вас будет весь выход, и вы должны лучше понять, что такое ошибка.
Если у вас есть определение внешнего ключа в некоторой таблице, а имя внешнего ключа используется в другом месте как другой внешний ключ, у вас будет эта ошибка.
Если вы хотите быстро исправить ошибку, Forward Engineer снова и проверьте вариант «Создать DROP SCHEMA» и продолжите.
Я предполагаю, что firebase database не содержит данных, поэтому ее падение не повлияет.
Я столкнулся с этой ошибкой (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».
Что-то, что я заметил, было то, что у меня были «other_database» и «Other_Database» в моих базах данных. Это вызвало эту проблему, поскольку у меня на самом деле была такая же ссылка в другой базе данных, которая вызвала эту загадочную ошибку!
mysql> SHOW ENGINE INNODB STATUS;
Но в моем случае только такой способ мог помочь:
1. Сделайте резервную копию текущей базы данных
2. Drop DB (не все таблицы, но DB)
3. Создайте БД (убедитесь, что у вас все еще есть предисловия)
4. Восстановить БД из резервной копии