ユーザーアイコン

mizuko

約1か月前

0
0

Drizzle ORM で MySQL INSERT IGNORE 相当の動作を実現する方法

Drizzle
MySQL
TypeScript

Drizzle ORMでMySQLのINSERT IGNORE(重複時は何もしない)と同等の動作を実現する方法。

MySQLにはPostgreSQLのON CONFLICT DO NOTHINGのような構文がないため、onDuplicateKeyUpdateを使用して実現する。

実装方法:

// 主キーを自分自身に設定する方法(推奨) await db.insert(tableName) .values(data) .onDuplicateKeyUpdate({ set: { primaryKeyColumn: sql`primary_key_column` // カラム名を自分自身に設定 } });

この方法により、重複キーが存在する場合は実質的に何も更新せず、新規レコードの場合のみ挿入される。INSERT IGNOREと同等の動作となる。

他の選択肢:

  1. updateTmなど更新に影響のないカラムを更新
  2. sql.rawを使用して直接INSERT IGNORE文を実行

注意点:

  • MySQLではonConflictDoNothing()は使用できない
  • onDuplicateKeyUpdate()のsetには何らかのカラム指定が必須