MySqlエラー150-外部キー
-
05-07-2019 - |
質問
次の2つのクエリを実行するとき(絶対に必要なクエリを削除しました):
mysql> CREATE TABLE foo(id INT PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;
次のエラーが表示されます。 エラー1005(HY000):テーブル './test/bar.frm'を作成できません(errno:150)
****はどこにエラーがありますか?これを見つめて30分も彼を見つけていない。
解決
以前のテーブルを再作成する場合 ドロップされ、定義が必要です 外部キーに適合している それを参照する制約。ちがいない 正しい列名とタイプがあり、 インデックスが必要です 前述のように、参照キー。もし これらは満たされていない、MySQLは返す エラー番号1005およびエラーを参照 エラーメッセージの150。
私の疑惑は、InnoDBとして foo
を作成しなかったためであるということです。他のすべてはOKに見えます。
編集:同じページから-
両方のテーブルはInnoDBテーブルでなければならず、TEMPORARYテーブルであってはなりません。
他のヒント
コマンド SHOW ENGINE INNODB STATUS
を使用して、エラーに関するより具体的な情報を取得できます。
多くのテキストを含む Status
列に結果が表示されます。
たとえば、次のような最新の外部キーエラーというセクションを探します:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
外部キーを作成するには、
- メイン列と参照列の両方に同じ定義が必要です。
- 両方のテーブルエンジンはInnoDBでなければなりません。
このコマンドを使用してテーブルのエンジンを変更できます。このコマンドを実行する前にバックアップを作成してください。
変更テーブル[テーブル名] ENGINE = InnoDB;
これを抱えている人にとっても同じ問題がありました:
参照されるテーブルのテーブル名を確認する
テーブル名の末尾の「s」を忘れていました
egテーブルクライアント->クライアント
:)
MySQLエラー150(InnoDBを使用中)で終わる他の多くの理由とは別に、考えられる理由の1つは、参照される列名を含むテーブルのcreateステートメントの未定義の KEY
です相対テーブルの外部キーとして。
マスターテーブルのcreateステートメントが-
であるとします CREATE TABLE 'master_table'(
  'id' int(10)NOT NULL AUTO_INCREMENT、
  'record_id' char(10)NOT NULL、
  'name' varchar(50)NOT NULL DEFAULT ''、
  'address' varchar(200)NOT NULL DEFAULT ''、
 主キー( 'id')
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
および外部キー制約がプライマリテーブルから設定されるrelative_tableテーブルの作成構文-
CREATE TABLE 'relative_table'(
  'id' int(10)NOT NULL AUTO_INCREMENT、
  'salary' int(10)NOT NULL DEFAULT ''、
  'grade' char(2)NOT NULL DEFAULT ''、
  'record_id' char(10)DEFAULT NULL、
 主キー( 'id')、
  CONSTRAINT 'fk_slave_master'外部キー( 'record_id')参照 'master'( 'record_id')
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
InnoDBを使用している場合、このスクリプトは間違いなくMySqlエラー150で終了します。
これを解決するには、 master_table
テーブルの列 record_id
に KEY
を追加し、 > relative_table
テーブルをforeign_keyとして使用します。
最後に、 master_table
のcreateステートメントは-
CREATE TABLE 'master_table'(
  'id' int(10)NOT NULL AUTO_INCREMENT、
  'record_id' char(10)NOT NULL、
  'name' varchar(50)NOT NULL DEFAULT ''、
  'address' varchar(200)NOT NULL DEFAULT ''、
 主キー( 'id')、
  KEY 'record_id'( 'record_id')
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
同じ問題がありましたが、その理由は「照合」でした。列の違いがありました。 1つはlatin1で、もう1つはutf8でした
これは、" references"の後に正しい列名を指定していない場合にも発生する可能性があります。キーワード。