エラー:エラー1005:テーブルを作成できません(エラー番号:121)


108

forward engineeringMySQLデータベースで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」)を実行して開始することをお勧めします。このコマンドは、ログ情報とエラーの詳細を表示します。そこから、どこで問題が発生しているのかを確認できます
Dorvalla '27 / 09/27

1
@Dorvallaの回答で解決しました。実際、INNODBステータスコマンドを実行すると、詳細なエラーログが列のLATEST FOREIGN KEY ERRORセクションに保存されstatusます。
Devy 2015

回答:


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

最も一般的には、同じ外部キー名を2回使用しようとしています!
2018

26

外部キー制約名はデータベース内で一意である必要があります

@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、2015

2

一部のテーブルに外部キー定義があり、外部キーの名前が別の外部キーとして別の場所で使用されている場合、このエラーが発生します。


2

このエラー(errno 121)が発生しましたが、孤立したmysqlで作成された中間テーブルが原因で、テーブル全体にそのような制約名が存在しなくてもテーブルを変更できませんでした。ある時点で、MySQLがクラッシュしたか、中間テーブル(#sql-で始まるテーブル名)のクリーンアップに失敗したため、次のようなエラーが表示されました:Ca n't create table '#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以上のバージョンでのみ機能します(このバージョンにはINNODB_SYS_TABLESが存在しないため、5.5以前のバージョンでの動作は手動では正しくありません)。コマンドラインでmysqlデータディレクトリを検索することで、孤立した一時テーブル(メッセージで指定されたテーブルと一致しなかった)を見つけることができました。

find . -iname '#*'

#sql-9ad_15.frmなどのファイル名を見つけた後、MySQLに孤立したテーブルをドロップすることができました。

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

その後、ALTER TABLEを正常に実行できました。

完全を期すために、リンクされたMySQLドキュメントに従って、「#mysql50#プレフィックスは、MySQL 5.1で導入されたファイル名セーフエンコーディングを無視するようにMySQLに指示します。」


1

迅速に修正したい場合は、フォワードエンジニアを再度選択し、[DROPスキーマの生成]オプションをオンにして続行します。

データベースにはデータが含まれていないので、削除しても影響はありません。


0

データベースに「other_database」と「Other_Database」が含まれていることに気付きました。他のデータベースで実際に同じ参照があり、この不可解なエラーが発生したため、この問題が発生しました。


-3
mysql> SHOW ENGINE INNODB STATUS;

しかし、私の場合、この方法だけが役立ちます:
1.現在のDBのバックアップを 作成します
2. DBをドロップします(すべてのテーブルではなくDB)
3. DBを作成します(まだ権限があることを確認します)
4.バックアップからDBを復元します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.