0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLのバルクインサート、バルクアップデート

Posted at

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処理が遅すぎたために複雑な機構を取ってる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?