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で発生していました。
備忘録です、忘れぬように ここに刻む