**比如有以下2个表:**
![微信截图_20180711190646.png](https://static.studygolang.com/180711/e28f4c22e27cded973bc335a02994d12.png)
* 表a记录一些基础信息:create table ta (id integer not null primary key autoincrement, name text not null);
* 表b的aid关联表a的id:create table tb (aid integer not null, t DATE, value DOUBLE not null, primary key(aid,t));
**待插入的数据:**
```
type insertData struct {
name string
t string
value float64
}
```
**数据插入时:**
1. 如果name在表a中存在,就获取它的id,然后再插入到表b,如果表b已经存在,就更新value
2. 如果name在表a中不存在,先插入到表a,然后再同上面一样
数据库我用的很少,我能想到的办法就是每一个都去表a里判断是否存在,然后再读取id,或者是插入后再读取id,这样一个一个操作很慢,想学习下有什么好方法解决这种问题?请高手指教,谢谢。
```
package main
import (
"database/sql"
"fmt"
"os"
_ "github.com/mattn/go-sqlite3"
)
type insertData struct {
name string
t string
value float64
}
type dataStruct struct {
DBPath string
db *sql.DB
}
var d *dataStruct
func init() {
d = new(dataStruct)
d.DBPath, _ = os.Getwd()
d.DBPath += `\test.db`
}
func main() {
if err := d.getDB(); err != nil {
fmt.Println(err)
return
}
}
// 如何高效的实现
func (me *dataStruct) insertData(data []inserData) {
}
func (me *dataStruct) getDB() (err error) {
if _, err = os.Stat(d.DBPath); err == nil {
if me.db, err = sql.Open("sqlite3", d.DBPath); err != nil {
return
} else {
fmt.Println("成功打开数据库。")
return nil
}
} else {
if me.db, err = sql.Open("sqlite3", d.DBPath); err != nil {
return
} else {
sqlStmt := `create table ta (id integer not null primary key autoincrement, name text not null);`
if _, err = d.db.Exec(sqlStmt); err != nil {
return
} else {
fmt.Println("成功创建表a。")
sqlStmt = `create table tb (aid integer not null, t DATE, value DOUBLE not null, primary key(aid,t));`
if _, err = d.db.Exec(sqlStmt); err != nil {
return
} else {
fmt.Println("成功创建表b。")
return nil
}
}
}
}
}
```
有疑问加站长微信联系(非本文作者)