MySQLエラー1005「テーブル作成失敗(errno: 121)」の原因と解決策を徹底解説!

2024-05-25

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

原因

このエラーにはいくつかの考えられる原因があります。最も一般的なものは次のとおりです。

  • 重複するテーブル名: すでに同じ名前のテーブルが存在する可能性があります。テーブル名は大文字小文字を区別するため、大小文字の違いであっても問題が発生する可能性があります。
  • 重複する制約名: 外部キー制約など、テーブルに定義されている制約の名前が重複している可能性があります。制約名はデータベース内で一意である必要があります。
  • 破損した InnoDB データディクショナリ: MySQL の内部データディクショナリが破損している可能性があります。これは、ハードウェアの故障、ソフトウェアのバグ、または予期せぬシャットダウンなどが原因で発生する可能性があります。

解決策

このエラーを解決するには、以下の手順を試してください。

  1. テーブル名を変更する: すでに同じ名前のテーブルが存在する場合は、テーブル名を変更する必要があります。
  2. 制約名を変更する: 制約名が重複している場合は、制約名を変更する必要があります。
  3. InnoDB データディクショナリを修復する: InnoDB データディクショナリが破損している場合は、innodb_file_per_table オプションを有効にして MySQL を再起動するか、CHECK TABLE ステートメントを使用してデータディクショナリを修復する必要があります。

その他のヒント

  • エラーメッセージの詳細を確認してください。エラーメッセージには、問題の特定に役立つ追加情報が含まれている場合があります。
  • MySQL エラーログを確認してください。エラーログには、問題の根本原因に関する手がかりとなる追加情報が含まれている場合があります。
  • オンラインで検索してください。このエラーに関する情報がオンラインで公開されている可能性があります。
  • MySQL コミュニティフォーラムで助けを求めてください。MySQL コミュニティフォーラムには、このエラーを解決するのに役立つことができる経験豊富なユーザーがいます。

    補足:

    • 上記の解決策は、MySQL 8.0 を使用している場合を想定しています。他のバージョンの MySQL を使用している場合は、エラーメッセージと解決策が異なる場合があります。
    • 問題が解決しない場合は、システム管理者またはデータベース管理者に連絡する必要があります。



    サンプルコード:MySQL でテーブルを作成する

    CREATE TABLE mytable (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(255) NOT NULL,
      email VARCHAR(255) NOT NULL,
      created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    

    このコードは次のことを行います。

    • mytable という名前のテーブルを作成します。
    • このテーブルには、次の 4 つの列があります。
      • id: 主キーであり、自動的にインクリメントされる整型数です。
      • name: NULL 値が許されない最大長 255 文字の文字列です。
      • created_at: デフォルト値が現在時刻である DATETIME 型の列です。

    注:

    • テーブルを作成する前に、データベースが存在していることを確認する必要があります。

    サンプルコード:エラー 1005 を発生させる

    以下のコードは、mytable という名前のテーブルを既に作成している場合に、mytable という名前のテーブルを作成しようとしてエラー 1005 を発生させます。

    CREATE TABLE mytable (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(255) NOT NULL,
      email VARCHAR(255) NOT NULL,
      created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    

    このコードを実行すると、次のエラーメッセージが表示されます。

    ERROR 1005: Can't create table 'mytable' (errno: 121)
    

    このエラーは、mytable という名前のテーブルが既に存在するためです。テーブルを作成するには、テーブル名を変更する必要があります。

    サンプルコード:InnoDB データディクショナリを修復する

    以下のコードは、CHECK TABLE ステートメントを使用して InnoDB データディクショナリを修復します。

    CHECK TABLE mytable;
    

    このコードを実行すると、InnoDB データディクショナリがスキャンされ、破損がないかどうかを確認されます。破損が見つかった場合は、修復されます。

    • このコマンドを実行するには、innodb_file_per_table オプションが有効になっている必要があります。
    • このコマンドを実行すると、テーブルがロックされます。

    この情報は参考目的でのみ提供されており、いかなる保証もありません。この情報の使用によるいかなる損害についても責任を負いません。




    MySQL エラー 1005: テーブル作成失敗 (errno: 121) の解決策

    MySQL でテーブルを作成しようとしたときに、エラー 1005: テーブル作成失敗 (errno: 121) が発生しました。

    • 重複するテーブル名: すでに同じ名前のテーブルが存在する可能性があります。
    • 破損した InnoDB データディクショナリ: MySQL の内部データディクショナリが破損している可能性があります。

    以下の解決策を試してください。

    テーブル名を変更する:

    InnoDB データディクショナリが破損している場合は、以下のいずれかの方法で修復する必要があります。

    • innodb_file_per_table オプションを有効にして MySQL を再起動する:

    このオプションを有効にすると、MySQL は各テーブルごとに個別の .ibd ファイルを作成します。これにより、データディクショナリが破損しても、すべてのテーブルが影響を受けるわけではありません。

      このステートメントは、テーブルをスキャンし、破損がないかどうかを確認します。破損が見つかった場合は、修復されます。

      その他の解決策:

      上記の方法で問題が解決しない場合は、以下の方法を試してください。

          その他のヒント

          • MySQL の最新バージョンを使用していることを確認してください。古いバージョンの MySQL には、既知のバグがある可能性があります。

          mysql


          【MySQL】HAVING句とエイリアスをマスター!グループ化されたデータの条件指定を極める

          本記事では、MySQLにおけるHAVING句とエイリアスの詳細な使い方について解説します。HAVING句とは?HAVING句は、GROUP BY句でグループ化されたデータに対して条件を指定するために使用されます。これは、WHERE句とは異なり、グループ化されたデータ全体に対して条件を適用します。...


          MySQL AUTO_INCREMENT 値がロールバックされない理由と、それを解決する 4 つの方法

          MySQL の AUTO_INCREMENT は、PRIMARY KEY カラムに自動的に一意の値を生成する便利な機能です。しかし、トランザクションがロールバックされた場合でも、AUTO_INCREMENT で生成された値は元に戻らないという点に注意が必要です。...


          Laravelマイグレーションエラー:指定されたキーが長すぎます (1071) の原因と解決方法

          このエラーを解決するには、以下の方法を試してください。キーの長さを短くするエラーメッセージに表示されているキー名を確認し、そのキーの長さを短くします。具体的には、以下の方法が考えられます。文字列型のカラムの場合、VARCHAR 型の最大長を短くする。...


          MySQL/MariaDBの識別子名:短く、分かりやすく、そして制限を超えない

          MySQL 5.7 以前: 最大64文字MySQL 5.7 以降、MariaDB 10. 2 以前: 最大64バイト (UTF-8 エンコーディングの場合、約128文字)識別子名が制限を超えると、エラーが発生します。例えば、以下のクエリを実行するとエラーが発生します。...


          3072バイトの壁を超える!MySQL/MariaDBエラー1071の解決策と回避策集

          このエラーは、MySQLまたはMariaDBでインデックスを作成または更新しようとすると発生します。インデックスキーが3072バイトを超えた場合に発生します。これは、インデックスキーの長さに対する制限です。原因このエラーの主な原因は以下の2つです。...


          SQL SQL SQL SQL Amazon で見る



          MySQL/MariaDB初心者でも安心!「errno: 121 Duplicate key on write or update」エラーの基礎知識と解決のヒント

          MySQL/MariaDB でテーブルを作成する際、CONSTRAINT を使用して主キーやユニークキーを定義することがあります。しかし、CONSTRAINT で定義した制約に違反するようなデータ挿入や更新操作を実行しようとすると、errno: 121 "Duplicate key on write or update" エラーが発生します。