DockerでMySQLなどのテスト環境を作っていたら(errno: 150 "Foreign key constraint is incorrectly formed")が出た話
背景
mariadbをdocker環境に移してテストしようとしたところ、30分くらい詰まってしまったのでここに供養します。
現象
外部参照用のテーブルを新規に作成しようとすると下記のエラーが出る。
ERROR 1005 (HY000): Can't create table `{dbname}`.`{tablename}` (errno: 150 "Foreign key constraint is incorrectly formed")
原因(1)
参照しようとしている行がユニークでないためエラーになっていた。
下記のようなSQLで、重複データを削除し プレマリキーとした。
CREATE TEMPORARY TABLE {table name}_tmp AS SELECT id,MIN(uid),MIN(name) FROM tweets GROUP BY id;
DELETE FROM {table name};
INSERT INTO {table name} SELECT * FROM {table name}_tmp;
DROP TABLE {table name}_tmp;
ALTER TABLE {table name} ADD PRIMARY KEY (id);
原因(2)
参照先と参照元の型が異なる場合に発生する。
同一の方であることを確認した。
原因(3)
テーブルのcharsetが異なる場合に発生する。
下記のコマンドで確認する。
SHOW CREATE TABLE {table name};
とりあえず、対象テーブルを同一なcharsetに修正する。
※データが入っていると色々面倒ですが、私は何も入っていないのですんなり行きました。
ALTER TABLE {table name} CONVERT TO CHARACTER SET {char set};
あと、外部参照がある、テーブルにも設定させる
create table{table name}(
{col} varchar(23) not NULL,
...
)ENGINE=InnoDB DEFAULT CHARSET={char set};
最後に
私は1と3で発生していました。
備忘録です、忘れぬように ここに刻む
Author And Source
この問題について(DockerでMySQLなどのテスト環境を作っていたら(errno: 150 "Foreign key constraint is incorrectly formed")が出た話), 我々は、より多くの情報をここで見つけました https://qiita.com/hashito/items/2a575f9a44aa3136c52d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .