Drizzle ORM で MySQL INSERT IGNORE 相当の動作を実現する方法
Drizzle
MySQL
TypeScript
Knowledge
Drizzle ORMでMySQLのINSERT IGNORE(重複時は何もしない)と同等の動作を実現する方法。
MySQLにはPostgreSQLのON CONFLICT DO NOTHINGのような構文がないため、onDuplicateKeyUpdateを使用して実現する。
実装方法:
typescript
// 主キーを自分自身に設定する方法(推奨)
await db.insert(tableName)
.values(data)
.onDuplicateKeyUpdate({
set: {
primaryKeyColumn: sql`primary_key_column` // カラム名を自分自身に設定
}
});この方法により、重複キーが存在する場合は実質的に何も更新せず、新規レコードの場合のみ挿入される。INSERT IGNOREと同等の動作となる。
他の選択肢:
- updateTmなど更新に影響のないカラムを更新
- sql.rawを使用して直接INSERT IGNORE文を実行
注意点:
- MySQLではonConflictDoNothing()は使用できない
- onDuplicateKeyUpdate()のsetには何らかのカラム指定が必須