外部キーをうまく作成することができません。なぜですか?
更新日時:
対応OS: iOS
Navicat対応製品: Navicat for MySQL, Navicat for PostgreSQL
Navicat対応バージョン: すべて
MySQL & MariaDB
1005: Can't create table '.\mydb\#sql-44c_1c.frm'(errno: 150)のようなMySQLエラーを受け取った場合、それは外部キーの作成の失敗が原因です。MySQLデータベースで外部キーの作成の失敗の原因となる可能性のあるケースがいくつかあります。それらのエラーはMySQLそのものに関係します。
例:
- 2つのフィールド(フィールド名と外部キー名)が互換性のないタイプを使用している場合。
- "On Delete Set Null"を使用しているが、そのフィールドはnullを許可していない場合。
MySQLで外部キーを宣言するためには、ユーザーが覚えておくべきポイントがいくつかあります:
- 両方のテーブルがInnoDBタイプでなければなりません。
- 参照されるテーブルに、参照される列が最初の列に同じ順番で並べられたインデックスがなければなりません。
- 外部キー列のインデックス接頭辞はサポートされていません。
- InnoDBは、外部キーのチェックが高速に行われ、テーブルスキャンが必要とされないために、外部キーと参照されるキーにインデックスを必要とします。
- 2つのキーフィールドは、互換性のあるフィールドタイプでなければなりません。
- integerタイプのサイズと符号は、同じでなければなりません。
- stringタイプの長さは、同じである必要はありません。
- 外部キーの名前は、データベース内で一意でなければなりません。
- SET NULLアクションを指定する場合、子テーブルの列をNOT NULLとして宣言していないことを確認してください。
外部キー制約の詳しい情報は、以下をご覧ください - http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
PostgreSQL
ERROR: there is no unique constraint matching given keys for referenced table "xxxx"のようなPostgreSQLエラーを受け取った場合、それは外部キーの作成の失敗が原因です。
PGSQLで外部キーを宣言するためには、ユーザーが覚えておくべきポイントがいくつかあります:
- FOREIGN KEY制約は、PRIMARY KEYまたはUNIQUE制約を参照しなければなりません。
- 2つのキーフィールドは、互換性のあるデータタイプでなければなりません。
- 参照するテーブルと参照されるテーブルの両方のREFERENCES権限を持っていなければなりません。
さらに質問がございましたら、