2
2

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 3 years have passed since last update.

PostgreSQLで複数のレコードを一括で更新(UPDATE)・追加(INSERT)する方法

Last updated at Posted at 2020-01-22

#経緯
ワーク(一時)テーブルのデータを本テーブルに登録する時の、複数のレコードを一括更新する方法を試してみましたので、
一応メモします。

##本テーブル(tbl01)の例

年月(year_mon) 名前(name) 指数(index)
202001 name1 123.45
202001 name2 234.56
202001 name3 345.67

##ワークテーブル(tbl01_wk)の例

年月(year_mon) 名前(name) 指数(index)
202001 name1 456.78
202001 name2 567.89
202001 name4 678.90
202001 name5 789.01

#目標1:更新
年月と名前を検索のキーとして、ワークテーブルのデータを本テーブルのデータと比較して、異なる場合本テーブルの指数を更新

update
	tbl01 as t1
set
	index = t2.index
from
	tbl01_wk as t2
where
	t1.year_mon = t2.year_mon
	and t1.name = t2.name
	and t1.index <> t2.index

#目標2:追加
年月と名前を検索のキーとして、ワークテーブルのデータは本テーブルに存在するかを確認して、存在しない場合本テーブルに追加

insert into
	tbl01
select
	t1.year_mon,
	t1.name,
	t1.index
from
	tbl01_wk as t1 
left join
	tbl01 as t2
on
	t1.year_mon = t2.year_mon
	and t1.name = t2.name
where
	t2.year_mon is null

#目標3:order byを使用
order byを使用してワークからデータを抽出して本テーブルに更新
※一時ファイルをワークに登録し、「最新の数行だけ」を更新する場合に役立つ

ワークの「最新の5行」を本テーブルに更新
update
	tbl01 as t1
set
	index = t2.index
from
(
	select
		* 
	from
		tbl01_wk
	order by
		year_mon desc
	limit 5
) as t2 
where
	t1.year_mon = t2.year_mon
	and t1.name = t2.name
2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?