次の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
を作成しなかったためです。
編集:同じページから-
両方のテーブルはInnoDBテーブルである必要があり、TEMPORARYテーブルであってはなりません。
コマンド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'.
外部キーを作成するには、
このコマンドを使用してテーブルのエンジンを変更できます。このコマンドを実行する前にバックアップを取ってください。
テーブルの変更[テーブル名] ENGINE = InnoDB;
(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_table
に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 '',
PRIMARY KEY ('id'),
KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
私はこれを持っている人たちにも同じ問題を抱えていました:
参照されているテーブルのテーブル名を確認してください
テーブル名の末尾の「s」を忘れていました
例:テーブルクライアント->クライアント
:)
これは、「references」キーワードの後に正しい列名を指定していない場合にも発生する可能性があります。
私も同じ問題を抱えていましたが、その理由は列の「照合」が異なっていたためです。 1つはlatin1で、もう1つはutf8でした