From 9127449a7a3b16c7abf8b75a3fdf25e84fc47950 Mon Sep 17 00:00:00 2001 From: t0ng7u Date: Sun, 31 Aug 2025 13:00:28 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(db):=20rename=20composite=20?= =?UTF-8?q?unique=20indexes=20to=20avoid=20drop/recreate=20on=20restart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Model: rename `uk_model_name` -> `uk_model_name_delete_at` (composite on `model_name` + `deleted_at`) - Vendor: rename `uk_vendor_name` -> `uk_vendor_name_delete_at` (composite on `name` + `deleted_at`) - Keep legacy cleanup in `model/main.go` to drop old index names (`uk_model_name`, `model_name`, `uk_vendor_name`, `name`) for compatibility. Result: idempotent GORM migrations and no unnecessary index churn on MySQL restarts. Files: - `model/model_meta.go` - `model/vendor_meta.go` --- model/main.go | 11 ++++++----- model/model_meta.go | 4 ++-- model/vendor_meta.go | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/model/main.go b/model/main.go index dbf271521..0fe9ceef9 100644 --- a/model/main.go +++ b/model/main.go @@ -270,9 +270,9 @@ func migrateDB() error { dropIndexIfExists("vendors", "uk_vendor_name") // 新版复合索引名称(若已存在) dropIndexIfExists("vendors", "name") // 旧版列级唯一索引名称 - //if !common.UsingPostgreSQL { - // return migrateDBFast() - //} + // 清理旧索引名(兼容历史),避免与新的复合唯一索引冲突 + // 说明:仅清理旧名 uk_model_name/model_name、uk_vendor_name/name;新索引名 uk_model_name_delete_at/uk_vendor_name_delete_at 不在清理范围 + // 计划:该兼容逻辑将在后续几个版本中移除 err := DB.AutoMigrate( &Channel{}, &Token{}, @@ -299,8 +299,9 @@ func migrateDB() error { } func migrateDBFast() error { - // 修复旧版本留下的唯一索引,允许软删除后重新插入同名记录 - // 删除单列唯一索引(列级 UNIQUE)及早期命名方式,防止与新复合唯一索引冲突 + // 清理旧索引名(兼容历史),允许软删除后重新插入同名记录 + // 说明:仅清理旧名 uk_model_name/model_name、uk_vendor_name/name;新索引名 uk_model_name_delete_at/uk_vendor_name_delete_at 不在清理范围 + // 计划:该兼容逻辑将在后续几个版本中移除 dropIndexIfExists("models", "uk_model_name") dropIndexIfExists("models", "model_name") diff --git a/model/model_meta.go b/model/model_meta.go index b7602b0ec..e9582e441 100644 --- a/model/model_meta.go +++ b/model/model_meta.go @@ -21,7 +21,7 @@ type BoundChannel struct { type Model struct { Id int `json:"id"` - ModelName string `json:"model_name" gorm:"size:128;not null;uniqueIndex:uk_model_name,priority:1"` + ModelName string `json:"model_name" gorm:"size:128;not null;uniqueIndex:uk_model_name_delete_at,priority:1"` Description string `json:"description,omitempty" gorm:"type:text"` Icon string `json:"icon,omitempty" gorm:"type:varchar(128)"` Tags string `json:"tags,omitempty" gorm:"type:varchar(255)"` @@ -30,7 +30,7 @@ type Model struct { Status int `json:"status" gorm:"default:1"` CreatedTime int64 `json:"created_time" gorm:"bigint"` UpdatedTime int64 `json:"updated_time" gorm:"bigint"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_model_name,priority:2"` + DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_model_name_delete_at,priority:2"` BoundChannels []BoundChannel `json:"bound_channels,omitempty" gorm:"-"` EnableGroups []string `json:"enable_groups,omitempty" gorm:"-"` diff --git a/model/vendor_meta.go b/model/vendor_meta.go index 88439f249..20deaea9b 100644 --- a/model/vendor_meta.go +++ b/model/vendor_meta.go @@ -14,13 +14,13 @@ import ( type Vendor struct { Id int `json:"id"` - Name string `json:"name" gorm:"size:128;not null;uniqueIndex:uk_vendor_name,priority:1"` + Name string `json:"name" gorm:"size:128;not null;uniqueIndex:uk_vendor_name_delete_at,priority:1"` Description string `json:"description,omitempty" gorm:"type:text"` Icon string `json:"icon,omitempty" gorm:"type:varchar(128)"` Status int `json:"status" gorm:"default:1"` CreatedTime int64 `json:"created_time" gorm:"bigint"` UpdatedTime int64 `json:"updated_time" gorm:"bigint"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_vendor_name,priority:2"` + DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_vendor_name_delete_at,priority:2"` } // Insert 创建新的供应商记录