MySQL联合唯一索引相关问题以及在kratos项目中演示

江湖乄夜雨 / 2023-05-31 / 原文

演示项目的地址

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条记录达不到效果

 

 

 

~~~

其他的方案