LoginSignup
1
1

More than 1 year has passed since last update.

【MySQL】外部キー制約がつけられなくてハマった話

Last updated at Posted at 2021-12-06

これまでPostgresSQLを使ってきたのですが、MySQLに切り替えたところ、今回の事象が発生しました。
ハマって調べる中でピッタリの答えが記載されているものが見つからなかったため、備忘録がてら記載します。

前提

companiesテーブルとemployeesテーブルを作成。

SQL文

CREATE TABLE companies(
id serial NOT NULL,
name text NOT NULL,
deleted boolean NOT NULL default false
);

CREATE TABLE employees(
id serial NOT NULL,
name text NOT NULL,
email text NOT NULL,
password text NOT NULL,
is_administrator boolean NOT NULL default false,
deleted boolean NOT NULL default false,
companies_id int NOT NULL
);

現象

employeesにcompany情報を持たせるために、companies_idというカラムを追加。
companies_id カラムに、companiesテーブルのidカラムとの外部キー制約をつけようとしたところ、
以下のようなエラーが出てハマりました。

ERROR 3780 (HY000): Referencing column 'companies_id' and referenced column 'id' in foreign key constraint 'user_employees_ibfk_1' are incompatible.

解決法

employeesテーブルのcompanies_idカラムの「型」をBIGINT UNSIGNEDにする

(UNSIGNEDは「符号なし」という意味)

詳細説明

companiesテーブルのidカラムの型をserial で指定していたのが原因でした。

型の設定について不透明だったのですが、
serialで指定すると、

  • BIGINT
  • UNSIGNED
  • AUTO_INCREMENT
  • (長さ20?)

の3つ(4つ)が自動指定されるようです。

※あとからHeidiSQLにて確認した画像※
image.png

なので、employeeテーブルのcompanies_idカラムの方を合わせてあげれば、無事に外部キー制約をつけることができます!

まとめ

最後までご覧いただきありがとうございます。
もし訂正・加筆すべき箇所がありましたらコメントにてご教示いただけますと幸いです。

1
1
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
1
1