登录
首页 >  Golang >  Go问答

golang 数据库主键的问题

来源:SegmentFault

时间:2023-02-25 07:57:16 217浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《golang 数据库主键的问题》,聊聊MySQL、Web、go、主键,希望可以帮助到正在努力赚钱的你。

问题内容

有两张表,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
}

正确答案

同一个会话中通过"SELECT LAST_INSERT_ID();"是可以返回新插入数据的主键值;
程序中有没有使用连接池,导致在不同的会话中执行了?

其他方案:

程序中生成uuid
触发器 

以上就是《golang 数据库主键的问题》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表