初めに
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")
以上。