golang 数据库主键的问题
有两张表,user和userInfo,用户在注册的时候向user表插入帐号密码,user表的userID是自增的,然后我想在此同时向userInfo插入一条相同userID的数据,在java的MyBatis里面可以在mapper中指定keyProperty属性,后来在golang中使用last_insert_id,返回的userID不对,如果在插入后,直接搜max(id)的话,感觉应该并发的时候有问题,难道解决方法只有存储过程了吗?有没有其他的在代码层的解决方案?
func (u TraUser) Add() (int, error) {
now := time.Now()
stmt, err := db.MysqlDB.Prepare("insert into tra_user(username,password,name,createDate) values(?,?,?,?)")
if err != nil {
log.Println(err)
return 0, err
}
defer stmt.Close()
u.UserName = u.UserName + strconv.FormatInt(now.Unix(), 10)
_, err = stmt.Exec(u.UserName, u.Password, u.Name, now)
if err != nil {
return 0, err
}
var userID int
row, err := db.MysqlDB.Query("SELECT LAST_INSERT_ID()")
if err != nil {
log.Println("err :", err)
return 0, err
}
row.Scan(&userID)
log.Println("userID :", err)
return userID, err
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
同一个会话中通过"SELECT LAST_INSERT_ID();"是可以返回新插入数据的主键值;
程序中有没有使用连接池,导致在不同的会话中执行了?
其他方案:
在golang里面很简单啊,你在同一个session中操作,比如 你第一个user := &User{**}, session.Save(user), 这个时候user 就会有ID了, 就是你要的主键,接下来 赋值到userInfo上就可以了,然后 在最后再commit,整个流程就完了, 但是切记,其中任何一步有错误,一定要rollback。
stmt.Exec()
执行会返回sql.Result
接口,它有LastInsertId()
方法,能拿到自增id.