Go中向带auto_increment自增主键的数据库插入数据报错解决
报错原因
报错的直接触发原因是INSERT语句的列定义数量和传入值数量不匹配:
- 语句中声明要写入的列共4个:
id、title、description、author - 后续VALUES子句里只写了3个占位符
?,实际传入的参数也只有3个(标题、描述、作者)
列和值的数量无法一一对应,数据库就会抛出Column count doesn't match value count at row 1错误。
另外id列已经设置了auto_increment自增属性,正常业务场景下不需要手动给该字段传值,原语句把id列加入写入列清单本身就是多余的。
自增主键表的正确插入写法
常规业务场景(推荐)
插入数据时不指定自增主键列,由数据库自动生成自增id值,保证列数、占位符数、传入参数数完全匹配即可:
_, err := db.Exec("INSERT INTO blogpost (title, description, author) VALUES (?,?,?)", newBlog.Title, newBlog.Description, newBlog.Author)
执行后如果需要拿到数据库自动生成的自增id,可以调用返回结果的LastInsertId方法获取:
if err != nil { // 自行处理执行错误 } blogId, err := res.LastInsertId()
特殊场景(需手动指定id)
如果是数据迁移、历史数据导入这类必须手动指定id值的场景,需要补全对应数量的占位符和参数,保证列和值一一对应:
// customId为需要手动写入的指定id值 _, err := db.Exec("INSERT INTO blogpost (id, title, description, author) VALUES (?,?,?,?)", customId, newBlog.Title, newBlog.Description, newBlog.Author)
注意:非必要不要手动给自增主键传值,否则容易引发主键冲突、自增序列断层等问题。
内容的提问来源于stack exchange,提问作者IcanCode
相关产品推荐
相关产品推荐

