web-dev-qa-db-ja.com

MySqlエラー150-外部キー

次の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分見つめている間、私は彼を見つけていません。

17
Martin Thurau

から FOREIGN KEY制約

ドロップされたテーブルを再作成する場合は、それを参照する外部キー制約に準拠する定義が必要です。前述のように、正しい列名とタイプが必要であり、参照されるキーにインデックスが必要です。これらが満たされない場合、MySQLはエラー番号1005を返し、エラーメッセージでエラー150を参照します。

私の疑惑は、他のすべてが問題ないように見えるので、InnoDBとしてfooを作成しなかったためです。

編集:同じページから-

両方のテーブルはInnoDBテーブルである必要があり、TEMPORARYテーブルであってはなりません。

30
Greg

コマンドSHOW ENGINE INNODB STATUSを使用して、エラーに関するより具体的な情報を取得できます。

たくさんのテキストを含むStatus列の結果が得られます。

LATEST FOREIGN KEY ERRORというセクションを探します。これは、たとえば次のようになります。

------------------------
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'.
11
user2906840

外部キーを作成するには、

  1. メイン列と参照列の両方が同じ定義である必要があります。
  2. 両方のテーブルエンジンはInnoDBである必要があります。

このコマンドを使用してテーブルのエンジンを変更できます。このコマンドを実行する前にバックアップを取ってください。

テーブルの変更[テーブル名] ENGINE = InnoDB;

4
Suyash Jain

(InnoDBの使用中に)MySqlエラー150が発生する他の多くの理由とは別に、考えられる理由の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 '',
 PRIMARY KEY ('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,
 PRIMARY KEY ('id'),
 CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

InnoDBを使用している場合、このスクリプトは間違いなくMySqlエラー150で終了します。

これを解決するには、record_idテーブルの列master_tableKEYを追加してから、relative_tableテーブルで参照してforeign_keyとして使用する必要があります。

最後に、master_tableのc​​reateステートメントは-になります。

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 '',
 PRIMARY KEY ('id'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1

私はこれを持っている人たちにも同じ問題を抱えていました:

参照されているテーブルのテーブル名を確認してください

テーブル名の末尾の「s」を忘れていました

例:テーブルクライアント->クライアント

:)

1
webmaster

これは、「references」キーワードの後に​​正しい列名を指定していない場合にも発生する可能性があります。

0
Ajay Sharma

私も同じ問題を抱えていましたが、その理由は列の「照合」が異なっていたためです。 1つはlatin1で、もう1つはutf8でした

0
Hamed J.I