GORM中如何指定多字段联合唯一索引
GORM 联合唯一约束配置方法
要实现Abc、Bcd两个字段的联合唯一校验,核心是通过同名称的uniqueIndex标签将两个字段绑定到同一个唯一索引下,具体配置如下:
原有代码问题
你给出的初始结构体定义存在三个明显问题:
gorm标签里的索引关键字拼写错误:unidqueIndex为错误拼写,正确拼写是uniqueIndexAbc字段的标签没有闭合,本身存在Go语法错误- 单独给单个字段加
uniqueIndex会生成单字段唯一索引,无法实现多字段联合校验的需求
正确配置代码
type ABC struct { ID uint Abc int `gorm:"uniqueIndex:idx_abc_bcd"` Bcd string `gorm:"uniqueIndex:idx_abc_bcd"` }
配置逻辑说明
- 上述代码中给
Abc和Bcd字段设置了同名的唯一索引idx_abc_bcd,GORM会自动为这两个字段创建联合唯一索引 - 该索引的校验逻辑为:只有两个字段的值同时和已有记录重复时,才会触发唯一约束冲突,完全匹配需求:
- 记录
{Abc: 1, Bcd: "hello"}和{Abc: 1, Bcd: "hi"}因Bcd字段值不同,不会触发冲突,可正常存储 - 重复插入
{Abc: 1, Bcd: "hello"}这类两字段值完全一致的记录时,会触发数据库唯一约束错误,插入被拦截
- 记录
注意事项
- 如果对应数据表已经提前创建完成,修改结构体标签后需要执行
db.AutoMigrate(&ABC{})完成表结构更新,或者手动在数据库中创建对应的联合唯一索引,否则配置不会生效 - 两个字段的索引名必须完全一致,若索引名不同会生成两个独立的单字段唯一索引,和预期效果不符
- 若需要自定义索引字段排序,可在标签后追加sort参数,示例:
gorm:"uniqueIndex:idx_abc_bcd,sort:desc",默认排序规则为升序。
内容的提问来源于stack exchange,提问作者Luqman Jr
相关产品推荐
相关产品推荐

