MySQL联合唯一索引相关问题以及在kratos项目中演示
演示项目的地址
https://gitee.com/huoyingwhw/kratos_rockscache.git
建立联合唯一索引的字段一定要设置为 NOT NULL
否则就会出现下面这样的“重复”数据:

插入时发现联合唯一索引冲突可以修改is_del
如果表中有软删除的标志,使用MySQL的 on duplicate key update 语句,当发现插入数据时有唯一索引冲突,在一些业务场景下我们其实是需要“恢复”数据的~此时更新is_del字段就好了~
data层片段代码:
func (g *greeterRepo) BatchCreateStudentCourses(ctx context.Context, scs []*biz.StudentCourse) error { db := g.data.Mysql.Table(biz.StudentCourseTableName).WithContext(ctx) db.CreateBatchSize = biz.BatchCreateSize // Notice 看实际的业务情况 // 唯一索引冲突 修改 is_del 字段 err := db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "student_id"}, {Name: "course_id"}}, DoUpdates: clause.Assignments(map[string]interface{}{ "is_del": biz.SCModelNotDeleted, }), }).Create(&scs).Error return err }
注意on duplicate key update语句如果发现没有“唯一索引”此时会新建2条记录达不到效果
~~~
其他的方案