SQLを使った一括更新を行なったので、その時の作業メモです。
この記事書くことで「バルク」という単語を知りました。
大前提として、トランザクションで区切る
SQLの最初に教えるべきこととして、トランザクション処理があります。
「テスト実行」とか「--dry-run」に近いSQLの 実行はするけど保存はしない 操作ができます。
特にinsert, delete, updateなどのデータ変更の処理をする時はトランザクション処理をしましょう(必須)
-- postgresqlの書き方
begin;
[一連の処理]
rollback;
-- コミットする時は「end;」
Insertのバルクインサート
1行ずつのInsertはやめて、バルクインサートの方がいいことが多いです。
処理速度が早いことと、可読性が上がるので後からの処理が楽です。
-- postgresqlの書き方
begin;
select * from food order by cd limit 3;
insert into
food (cd, name)
values
('000', 'パン')
('001', 'ごはん')
('002', '海苔')
('003', '納豆')
('004', '梅干し');
select * from food order by cd limit 3;
rollback;
-- コミットする時は「end;」
Updateのバルクアップデート
1行ずつのUpdateはやめてバルクアップデートの方がいいことが多いです。
case-whenを使った一括操作です。
update句をたくさん書く書き方もありますが、多分こっちの方が早い
(いい参考文献あれば共有いただけると嬉しいです)
条件分けがあるのに、where句を使わずにかけてるところがポイントです。
-- postgresqlの書き方
begin;
select * from food order by cd limit 3;
update
food
set
name =
case
when cd = '000' then 'パン'
when cd = '001' then 'ごはん'
when cd = '002' then '海苔'
when cd = '003' then '納豆'
when cd = '004' then '梅干し'
else ''
end;
select * from food order by cd limit 3;
rollback;
-- コミットする時は「end;」
あとがき
仕事で学んだことのメモとして記事を書いていますが、仕事で使っているシステムがEnterを押して帰ってくるまで裏でやってるDB処理が遅すぎたために複雑な機構を取ってる