使用GORM创建User表触发Error 1075错误,请求排查
GORM自动迁移User表触发Error 1075错误排查
问题详情
尝试使用GORM创建User表时,持续触发如下错误:
2022/08/29 01:31:58 /app/infra/database/db.go:26 Error 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key
[0.156ms] [rows:0] ALTER TABLE
usersADDidbigint unsigned AUTO_INCREMENT
即使去掉gorm.Model仍报错,当前使用的User模型:
type User struct { gorm.Model Name string }
数据库初始化代码:
dsn := fmt.Sprintf("%s:%s@(%s:3306)/%s?charset=utf8&parseTime=True", os.Getenv("DB_USERNAME"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_URL"), os.Getenv("DB_NAME"), ) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Print(err) panic("error connecting to the database") } db.AutoMigrate(&user.User{}) return db, nil
问题原因
错误核心是数据库中已存在的users表结构与GORM模型预期冲突:
- 数据库内的
users表可能已手动创建过,且存在一个自增列(比如自定义的user_id),GORM自动迁移时尝试添加id自增列,导致出现多个自增列的冲突。 - 即使去掉
gorm.Model,若原表的自增列未被设为主键,或与自定义模型的主键定义不匹配,也会触发该错误。
解决办法
清理冲突表
登录MySQL执行DESC users;查看表结构,确认存在冲突的自增列。若该表为测试遗留的无用表,直接删除:DROP TABLE users;之后重新运行程序,GORM会自动创建符合模型定义的表。
自定义模型时明确主键规则
若不想使用gorm.Model,需手动指定主键和自增属性:type User struct { ID uint `gorm:"primaryKey;autoIncrement"` Name string }适配现有表结构
若需保留现有表数据,手动修改表结构:给目标自增列添加主键约束,或删除多余的自增列,确保表结构与GORM模型一致。开启日志调试(可选)
初始化GORM时开启详细日志,便于排查结构不匹配问题:db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), })
内容的提问来源于stack exchange,提问作者Sergio Ramirez
相关产品推荐
相关产品推荐

