【Ruby on Rails】insert_all, insert_all!, upsert_allの違い
アトミックに実行されるため全てのレコードが正しく挿入されるか、またはどれも挿入されないという状態が保証される。
insert_all
複数行を一括 INSERT。重複はスキップする。コールバック/バリデーションは走らない。
insert_all!
複数行を一括 INSERT。重複が1つでもあれば例外を投げ、全行挿入されない。コールバック/バリデーションは走らない。
upsert_all
複数行を一括 UPSERT。重複時は UPDATE。コールバック/バリデーションは走らない。
code:ruby
rows = [
{ email: "a@example.com", name: "A" },
{ email: "b@example.com", name: "B" }
]
# insert_all
User.insert_all(rows)
# insert_all
# 重複があれば例外(ActiveRecord::RecordNotUnique)
Userinsert_all!(rows)
# upsert_all
User.upsert_all(rows, unique_by: :email)