jackytom
@jackytom

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

mariadbの外部キー追加でエラー

Q&A

Closed

mariadbにて「contact_div」テーブルを、「contact」テーブルの外部キーに
設定したいです。
そのため、下記のsqlを実行しました。

alter table contact add foreign key(contact_div_id) references contact_div(contact_div_id);

そういたしますと、下記のエラーが表示されます。

#1005 - `salon`.`contact` テーブルが作れません.(errno: 150 "Foreign key constraint is incorrectly formed")

エラー原因を調査したところ、このエラーは、
(1)参照元と参照先の項目の型が一致していない。
(2)参照元項目がテーブルのユニークキーになっていない。

の2点のようですが、こちらを確認したところ、
(1)に関しては、両方init(10)です。
(2)に関しては、両方ともプライマリキーです。

他に確認ポイントはありますか?
ご教示いただければ幸いです。

0

2Answer

両方ともプライマリキーです。

CREATE TABLE contact_div (
  contact_div_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  PRIMARY KEY (contact_div_id)
);

CREATE TABLE contact (
  contact_div_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  PRIMARY KEY (contact_div_id)
);

alter table contact add foreign key(contact_div_id) references contact_div(contact_div_id);

このようにテーブル SQL を作成すると、 contact テーブルと contact_div テーブルの両方に同じ列名 contact_div_id があり、外部キー制約を追加しようとすると競合が発生します。

0Like

Comments

  1. @jackytom

    Questioner

    回答ありがとうございます。
    https://qiita.com/ymzkjpx/items/a4dc01c2a7da32bb8712
    を確認し、両方のテーブルでプライマリキーでないといけないものと勘違いしていました。
    しかし、CONTACTテーブルのプライマリキーをdropしても結果は同じでした。
    他に確認ポイントはありますか?

  2. 指定されたテーブルを作成した CREATE TABLE ステートメントを示します。 2 つのテーブル構造を確認してください

こちらでは今、お祭りの真っ只中です。

原因は(2)のようですが、コードの不一致でも類似で発生する例を紹介します。ご参考まで。

0Like

Comments

  1. @jackytom

    Questioner

    回答ありがとうございます。
    「show create table」で双方のテーブルを確認したところ、両方utf8mb4でした。
    他に確認ポイントはありますか?

  2. 私的には原因は(2)で確定なのですが?

    支障のない範囲でshow create tableを
    コードブロックで掲示できますか?

    外部キーの作成の着眼点がズレているように思えます。

    CONTACTテーブルのプライマリキーをdrop

    drop前が良いかも

    また、contact、contact_divのテーブルの用途、関係を簡単に教えてください。

  3. @jackytom

    Questioner

    ご無沙汰してしまい、大変申し訳ありません。
    よく見てみたら、親テーブルのプライマリーキー項目と、子テーブルの外部キーにしようとした項目の型が異なっていたのが原因でした。
    両方ともint(10)なのですが、子の方にはunsignedが未設定でした。
    子の方にもunsignedを設定することで解決しました。
    お騒がせしました。
    本件、クローズさせていただきます。

Your answer might help someone💌