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