0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DockerでMySQLなどのテスト環境を作っていたら(errno: 150 "Foreign key constraint is incorrectly formed")が出た話

Last updated at Posted at 2020-05-24

背景

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?