LoginSignup
26
15

More than 5 years have passed since last update.

【Go言語】GORMで外部キー制約を設定する

Posted at

初めに

GORMの公式マニュアルを読んでいるとAssociationsの項目に外部キーについての記述が有る。
例に倣ってモデル定義しGORMのオートマイグレーション機能を実行してみた。
しかしDBテーブルには外部キー制約は反映されなかった。

どの様に外部キーを反映させるか?

外部キー制約について明示的に設定する必要が有る。

例えば以下の様なGORM向けモデルが有ったとする。
Userは複数のEventを持つ関係。

type User struct {
    ID uint
    Name string
    Events []Event
}

type Event struct {
    ID uint
    UserID uint  ←  外部キーにしたい
    Number uint
}

オートマイグレーションに続けて以下の様に外部キー設定を実行する。

db.AutoMigrate(User{})
db.AutoMigrate(Event{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")

外部キー制約を設定出来た。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

CREATE TABLE `events` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned DEFAULT NULL,
  `number` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `events_user_id_users_id_foreign` (`user_id`),
  CONSTRAINT `events_user_id_users_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

CASCADE動作させたい場合。

  • DELETE CASCADE(第3引数を変更する)
db.AutoMigrate(Event{}).AddForeignKey("user_id", "users(id)", "CASCADE", "RESTRICT")
  • UPDATE CASCADE(第4引数を変更する)
db.AutoMigrate(Event{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "CASCADE")

おまけ

複合ユニークキーを設定したい場合、

db.Model(&Event{}).AddUniqueIndex("unq_xxxx", "user_id", "number")

以上。

26
15
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
26
15