一度に複数のデータを1回のクエリでインサートしたいとき(bulk insert)、insert
PHP/Laravel
クエリビルダのinsert
メソッド
DB::table('users')->insert([
['email' => 'picard@example.com', 'votes' => 0],
['email' => 'janeway@example.com', 'votes' => 0],
]);
先輩エンジニアに聞いたところ、「bulk insertは使うとしたら100万件くらいのデータ量の場合だが極力使わないほうがいい」とのこと。
今回のプロジェクトではデータ量がそこまで大量ではなかったため、bulk insertは結局使わないことにした。
下記記事も参考になった。
ただ、調べるとLaravel8からupsert
メソッドが使えるらしい。
今までupdateOrCreate
を使用していた場面でupsert
を使えば1つのクエリで複数の「アップサート」を実行できるので便利そう。
Ruby/Rails
別プロジェクトで下記のgemを使ってbulk insertしていた。
books_attributes = [
{ title: "Book 1", author: "George Orwell" },
{ title: "Book 2", author: "Bob Jones" }
]
books.import(books_attributes)
Rails6以降はinsert_all
メソッドが追加された。
まとめ
bulk insertを使うかどうかは各プロジェクトやエンジニアの考え方によるので、一概に決めつけず柔軟に考えられるようにしたい。