外部キーの作成がうまくいきません。なぜですか?
更新日時:
対応OS: Windows, macOS, Linux
Navicat対応製品: Navicat for MySQL, Navicat for PostgreSQL, Navicat for SQLite, Navicat for Oracle, Navicat for MariaDB, Navicat Premium
Navicat対応バージョン: すべて
MySQL & MariaDB
1005: Can't create table '.\mydb\#sql-44c_1c.frm'(errno: 150)のようなMySQLのエラーを受け取った場合、それは外部キーの作成に失敗したことが原因です。MySQLデータベースの外部キー作成の失敗を引き起こす可能性があるケースはいくつあります。これらのエラーはMySQLそのものに関係します。
例:
- 2つのフィールド(フィールド名と外部フィールド名)が互換性のないフィールドタイプを使用している場合。
- "削除時 SET NULL"を使用しているが、フィールドはnullを許可していない場合。
MySQLで外部キーを設定する時の覚えておくべきポイント:
- 両方のテーブルがInnoDBタイプでなければならない。
- 参照される側のテーブルに、参照される列が最初の列として同じ順で列挙されたインデックスがなければならない。
- 外部キー列上のインデックス接頭辞がサポートされていない。
- InnoDBは、外部キーのチェックを高速化し、テーブルスキャンを不要にするために、外部キーと参照キー上にインデックスを必要とする。
- 2つのキーフィールドは互換性のあるフィールド型でなければならない。
- 整数型の場合、サイズと符号は同じでなければならない。
- 文字列型の場合、長さが同じでなければならない。
- 外部キーの名前はデータベース内で一意でなければならない。
- 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のエラーを受け取った場合、それは外部キーの作成に失敗したことが原因です。
PostgreSQLで外部キーを設定する時の覚えておくべきポイント:
- 外部キー制約はプライマリーキー制約またはUNIQUE制約を参照しなければならない。
- 2つのキーフィールドは互換性のあるデータ型でなければならない。
- 参照するテーブルと参照されるテーブルの両方に対してREFERENCES権限がなければならない。
Oracle
Oracleで外部キーを設定する時の覚えておくべきポイント :
- 外部キー制約はプライマリーキー制約またはUNIQUE制約を参照しなければならない。
- 2つのキーフィールドは互換性のあるデータ型でなければならない。
- 複合外部キーは32列に制限されている。
- 親テーブルと子テーブルへのアクセスを許可されていなければならない。
外部キー制約に関する詳細はこちらをご覧ください - http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10795/adfns_co.htm#1006976
SQLite
SQLiteで外部キーを設定する時の覚えておくべきポイント :
- 親キーと子キーは同じカーディナリティをでなければならない。
外部キー制約に関する詳細はこちらをご覧ください - http://www.sqlite.org/foreignkeys.html