LoginSignup
0
0

More than 1 year has passed since last update.

外部キー制約での整合性について

Posted at

はじめに

現在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
);

すごく簡単なことでしたが、親テーブルと子テーブルの関連付けているカラムの型が異なっていたため、整合性がなくエラーになっていました。

↓公式にも書いてありました。

外部キー内の対応するカラムと、参照されるキーは同様のデータ型を持っている必要があります。

ご参考まで。

参考サイト

MYSQL公式

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