0
Help us understand the problem. What are the problem?

posted at

【Go, Mysql】 DBに指定したidがあればinsert, なければupdate を行う

Go , MySql で 指定したidにレコードがなければinsert, あればupdateを行う

dockerのMySqlにplacesテーブルを作成後、初期データをinsertしたかったため、primary keyのidをauto incrementせずにidを指定してinsertを行うようにした。

しかし、下記の場合だと、再度実行する際にDBにレコードが入っており、primary keyが重複するというエラーが発生した。

db.go

func init(){
	cmd := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s(
		id INT PRIMARY KEY,
		name TEXT,
		address TEXT)`, places)
	Db.Exec(cmd)

    insert_init_data()
}

func CreatePlace(id int, place string, address string) (err error) {
	cmd := `insert into places(
		id,
		name,
		address
	) values (?, ?, ?)`

	_, err = Db.Exec(cmd,
		id,
		place,
		address)
	if err != nil {
		log.Fatalln(err)
	}
	return err
}

func insert_init_data(){
	CreatePlace(1, "place1", "address1")
	CreatePlace(2, "place1", "adderss2")
	CreatePlace(3, "place3", "address3")
	CreatePlace(4, "place4", "address4")
	CreatePlace(5, "place5", "address5")
}

スクリーンショット 2022-05-08 11.30.45.png

以下のようにON DUPLICATE UPDATE構文を用いることにより解決。
指定したidにレコードがなければinsert, なければupdateを行うことができた。

db.go
func CreatePlace(id int, place string, address string) (err error) {
	cmd := `insert into places(
		id,
		name,
		address
	) values (?, ?, ?) ON DUPLICATE KEY UPDATE name=VALUES(name), address=VALUES(address)`

	_, err = Db.Exec(cmd,
		id,
		place,
		address)
	if err != nil {
		log.Fatalln(err)
	}
	return err
}

参考

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?