Typeorm + MySQL(MariaDB) で ON DUPLICATE KEY UPDATE
2020/02/07 16:59:332022/12/07 19:12:28
重複する.ts
const data = new User({ id: 1, name: 'a' })
await getConnection()
.createQueryBuilder()
.insert()
.into(User)
.values([data])
.execute()
ER_DUP_ENTRY: Duplicate entry '1' for key 'PRIMARY'
となります。 onConflict
を使うバージョンが大量に出てきますが、これは Postgres のみのオプションのようで、MySQL 系だと普通に無視されてしまいます d.ts
に Adds additional ON CONFLICT statement supported in postgres.
と書いてあります orUpdate
を用いる方法を紹介します。 重複しない.ts
const data = new User({ id: 1, name: 'a' })
await getConnection()
.createQueryBuilder()
.insert()
.orUpdate(["name"], "id")
.into(User)
.values([data])
.execute()
conflict_target
が重複した時(または無指定でも DUP したとき) overwrite
に指定された string[]
の中身に従って上書きを行います。 orUpdate.sql
INSERT INTO `users`(`id`, `name`) VALUES (?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name)
ON DUPLICATE KEY UPDATE
が実施されていることがわかります。 orUpdate
の他のオプションについても記述します。 overwrite: string[]
conflictTarget?: string | string[]
d.ts
みてた時に気づいたんですけど orIgnore
というのもありますね。 string | boolean
しか受け付けてなさそう。 DO NOTHING
っぽい動きをしそうです orIgnore.sql
INSERT IGNORE INTO `users`(`id`, `name`) VALUES (?, ?)
INSERT IGNORE
構文なんてあるんだ… conflict_target
を前に置いていた場合、順番が逆になっているので注意 Generated from
Typeorm + MySQL(MariaDB) で ON DUPLICATE KEY UPDATE