次に示すのは、発生する可能性のある InnoDB
固有の一般的なエラーのリスト (ただし、すべてが含まれているわけではありません)、および各エラーが発生する理由と問題の解決方法に関する情報です。
-
1005 (ER_CANT_CREATE_TABLE)
テーブルを作成できません。エラーメッセージがエラー 150 を示している場合は、外部キー制約が正しく形成されていなかったためにテーブルの作成が失敗しました。エラーメッセージがエラー -1 を示している場合は、テーブルに内部の
InnoDB
テーブルの名前に一致したカラム名が含まれているためにテーブルの作成が失敗した可能性があります。 -
1016 (ER_CANT_OPEN_FILE)
InnoDB
テーブルの.frm
ファイルが存在するにもかかわらず、このテーブルがInnoDB
データファイルに見つかりません。セクション14.19.3「InnoDB データディクショナリの操作のトラブルシューティング」を参照してください。 -
1114 (ER_RECORD_FILE_FULL)
InnoDB
でテーブルスペース内の空き領域が不足しています。新しいデータファイルを追加するために、テーブルスペースを再構成してください。 -
1205 (ER_LOCK_WAIT_TIMEOUT)
ロック待機のタイムアウトの期限が切れました。トランザクション全体ではなく、待機時間の長すぎたステートメントがロールバックされました。
innodb_lock_wait_timeout
構成オプションの値は、SQL ステートメントがほかのトランザクションの完了をより長い時間待機するようにする場合は増やし、また長時間実行されるトランザクションが多すぎるためにロックの問題が発生し、さらにビジー状態のシステム上の並列性が低下している場合は減らすことができます。 -
1206 (ER_LOCK_TABLE_FULL)
ロックの総数が、
InnoDB
でロックの管理専用に使用されているメモリーの量を超えています。このエラーを回避するには、innodb_buffer_pool_size
の値を増やします。個々のアプリケーション内では、大きな操作をより小さな操作に分割することが回避方法になる場合があります。たとえば、このエラーが大きなINSERT
で発生する場合は、複数のより小さなINSERT
操作を実行します。 -
1213 (ER_LOCK_DEADLOCK)
トランザクションでデッドロックが発生し、アプリケーションで修正措置をとることができるように自動的にロールバックされました。このエラーからリカバリするには、このトランザクション内のすべての操作を再度実行します。デッドロックは、ロックに対する要求がトランザクション間で整合性のない順序で到着した場合に発生します。ロールバックされたトランザクションがそのすべてのロックを解放したため、ほかのトランザクションは要求したすべてのロックを取得できるようになりました。そのため、ロールバックされたトランザクションを再実行すると、そのトランザクションがほかのトランザクションの完了を待機しなければならないことがありますが、通常デッドロックは再発しません。デッドロックが頻繁に発生する場合は、ロック操作のシーケンス (
LOCK TABLES
、SELECT ... FOR UPDATE
など) を、問題が発生する異なるトランザクションまたはアプリケーション間で整合性があるようにしてください。詳細は、セクション14.2.11「デッドロックの対処方法」を参照してください。 -
1216 (ER_NO_REFERENCED_ROW)
行を追加しようとしていますが、親の行がないため、外部キー制約に違反します。最初に親の行を追加してください。
-
1217 (ER_ROW_IS_REFERENCED)
子を持つ親の行を削除しようとしているため、外部キー制約に違反します。最初に子を削除してください。
-
ERROR 1553 (HY000): インデックス '
fooIdx
' をドロップできません。外部キー制約で必要とされていますこのエラーメッセージは、特定の参照制約を適用できる最後のインデックスを削除しようとしたときにレポートされます。
DML ステートメントの最適なパフォーマンスを得るために、
InnoDB
では、親テーブルでのUPDATE
およびDELETE
操作で、対応する行が子テーブル内に存在するかどうかを容易にチェックできるように、インデックスは外部キーカラムに存在する必要があります。CREATE TABLE
、CREATE INDEX
、およびALTER TABLE
ステートメントの副作用として、MySQL は、このようなインデックスを必要に応じて自動的に作成または削除します。インデックスを削除すると、
InnoDB
は、そのインデックスが外部キー制約のチェックに使用されていないかどうかをチェックします。同じ制約を適用するために使用できる別のインデックスが存在する場合は、引き続きインデックスを削除できます。InnoDB
は、特定の参照制約を適用できる最後のインデックスを削除できないようにしています。