概要
select したデータを使って update するためのSQL。 select と update を別々に実行するのではなく、同時に実行できる。
2020.10.16 追記
バージョン 3.33.0 で「update~from」構文がサポートされた。 より簡単にselectしたデータでupdateすることが可能になっている。
詳しくは以下のURLより。
SQLite3 Selectした結果でUpdateする (update from)
UPDATE FROM (英語) 公式のUPDATE~FROMに関するドキュメント
環境
- Windows 10 64bit
- SQLite3 (3.24.0) Command-Line Shell
insert ~ select ~ on conflict
selectした結果を使ってupsertする手順のうち、updateのみを行う。
SQLite3 でレコードがあれば更新、なければ新規挿入する (on conflict)
以下の点、注意。
- 文法の都合上「where true」が必要
-
主キーなどが重複した場合、select の結果はexcludedという一時テーブルに格納される。
update する際はexcludedのデータを利用する。 - 主キーが重複しないレコードは新規挿入になってしまうため、 updateだけを行いたい場合はselect文で調整する。
inert into
table_01
select
*
from
table_02
where true
on conflict(column01)
do update
set
column_02 = excluded.colum_02
, column_03 = excluded.column_03
;
update ~ select
サブクエリでselect したデータを使って update する。
ポイントは
- サブクエリのWhere句で二つのテーブルのキーを一致させる
- メインクエリのWhere句で対象のレコードを指定する
update
table_01
set
column_02 = (
select
table_02.column05
from
table_02
where
table_02.column04 = table_01.column_01
)
where
table_01.column_01 = XXXX
;
参考URL
-
SQLite 公式サイト(英語)
https://www.sqlite.org/index.html -
SQLite Query Language: upsert (英語)
公式のUPSERTに関するドキュメント
https://www.sqlite.org/lang_UPSERT.html -
SQLite Query Language: UPDATE(英語)
公式のUPDATE構文に関するドキュメント
https://www.sqlite.org/lang_update.html -
UPDATE FROM(英語)
公式のUPDATE FROM構文に関するドキュメント
https://www.sqlite.org/lang_update.html#upfrom
-
あさはか 備忘録: SQLite3 でレコードがあれば更新、なければ新規挿入する (on conflict)
https://sfnovicenotes.blogspot.com/2019/07/sqlite3-on-conflict.html