はじめに
現在GolangでAPIサーバーを構築しております。
それに伴いDBの関連付けを行おうとしたところエラーが起きて躓いてしまったため、記録を残します。
外部キー制約について(公式より)
MySQL では、テーブル間の相互参照関連データを許可する外部キー、および関連データの一貫性を保つための外部キー制約がサポートされています。
外部キー関係には、初期カラム値を保持する親テーブルと、親カラム値を参照するカラム値を持つ子テーブルが含まれます。 子テーブルに外部キー制約が定義されています。
環境
- MYSQL8.0
問題のコード
CREATE TABLE `users` (
id bigint AUTO_INCREMENT NOT NULL,
name VARCHAR(255),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE `answers` (
id INT AUTO_INCREMENT NOT NULL,
user_id INT,
answer VARCHAR(255),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (id),
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE CASCADE
);
Migrateしようとしたら。。。。
Migration failed: Error 3780: Referencing column 'user_id' and referenced
column 'id' in foreign key constraint 'answers_ibfk_1' are incompatible.
handling 20210829033132-answers.sql
usersテーブルのidカラムとanswersデーブルのuser_idの互換性がない。と怒られています。
修正版
CREATE TABLE `users` (
id INT AUTO_INCREMENT NOT NULL, ←ここを修正
name VARCHAR(255),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE `answers` (
id INT AUTO_INCREMENT NOT NULL,
user_id INT,
answer VARCHAR(255),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (id),
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE CASCADE
);
すごく簡単なことでしたが、親テーブルと子テーブルの関連付けているカラムの型が異なっていたため、整合性がなくエラーになっていました。
↓公式にも書いてありました。
外部キー内の対応するカラムと、参照されるキーは同様のデータ型を持っている必要があります。
ご参考まで。