【最短5分】SQLite3でUPSERTを実現する2つの方法

 

★悩み★
・SQLite3において、UPSERTを実行したいけど、どのコマンドを使うの?
・そもそもUPSERTって何?
・SQLite3でUPSERTを実現する方法を知りたい。



こういった「悩み」に答えます。
 

★本記事の内容★
① そもそもUPSERTとは?
➁ SQLite3でUPSERTを実現するための準備を解説
➂ SQLite3でUPSERTを実現する2つの方法を解説



これからご紹介する「【最短5分】SQLite3でUPSERTを実現する2つの方法」を実践したことで、筆者は10分以内でSQLite3においてUPSERTでデータ更新をできました。
 

記事の前半では「UPSERTとは何か?」や「SQLite3でUPSERTを実現するための準備」を解説します。
記事の後半では「SQLite3でUPSERTを実現する2つの方法」を紹介します。
 

この記事を読み終えることで、「SQLite3でUPSERTを実現する方法」を把握できるだけでなく、「INSERT OR REPLACE INTOやON CONFLICTの構文」も把握した状態になります。
 

ちなみに、SQLiteのメリットとデメリットに関して知りたい方には、以下の記事がオススメです。
>> 【要点】SQLiteとは?を解消!初心者向けに特徴から使い方を解説
  

また、筆者が約2週間でSQLite3を学んだ方法や手順について以下で公開しています。皆様の学習の参考になれば嬉しいです。

>> SQLite3に0から入門し基本操作を習得するまでのロードマップ


 

 


 

そもそもUPSERTとは?


UPSERTの定義は以下となります。
 

★UPSERTの定義★
UPSERTとは、「データの新規挿入(INSERT)ができれば挿入を行い、新規挿入ができなければ更新(UPDATE)を行う」クエリのことです。
UPSERTの読み方ですが、「アップサート」や「アプサート」とよく言っているのを開発現場で聞きます。

参照:UPSERTとは(wikipedia)



ちなみに、UPSERTとINSERTの違いは以下となります。
 

★UPSERTとINSERTの違い★
・挿入したいデータが存在する場合
 INSERT:挿入したいデータが挿入されない(エラーが発生する)
 UPSERT:存在するデータが更新される(エラーが発生しない)
・挿入したいデータが存在しない場合
 INSERT:挿入される
 UPSERT:挿入される



また、UPSERTとUPDATEの違いは以下となります。
 

★UPSERTとUPDATEの違い★
・更新したいデータが存在する場合
 UPDATE:存在するデータが更新される
 UPSERT:存在するデータが更新される
・更新したいデータが存在しない場合
 UPDATE:存在しないためデータが更新されない
 UPSERT:データが新規挿入される


 

SQLite3でUPSERTを実現するための準備


「SQLite3でUPSERTを実現するための準備」に関してご紹介します。
 

★SQLite3でUPSERTを実現するための準備の流れ★
手順1:SQLite3をインストール
手順2:インストールしたSQLite3の動作確認
手順3:SQLite3内にテーブルを作成
手順4:作成したテーブルに主キーを追加



上記手順を実施することで、「SQLite3でUPSERTを実現するための準備」ができます。
 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2022年8月24日
動作確認済み環境:Ubuntu 20.04.3 LTS



以降で、上記「SQLite3でUPSERTを実現するための準備の流れ」の各手順に関してご説明します。
 

手順1:SQLite3をインストール

「手順1:SQLite3をインストール」に関して解説します。
 

SQLite3でUPSERTを実行するためにも、SQLite3をインストールしましょう。



「SQLite3をインストールする手順」に関しては、お使いのパソコンごとに以下の記事を参照しインストールしましょう。

>>【コピペOK】SQLite3をインストールする手順【Linux向け】

>>【コピペOK】SQLite3をインストールする手順【Ubuntu向け】

>>【最短5分】SQLiteをWindowsへインストールする方法(6枚で図解)

>>【コピペOK】SQLite3をインストールする手順【MacOS向け】



以上で、「手順1:SQLite3をインストール」は完了です。
 

手順2:インストールしたSQLite3の動作確認

「手順2:インストールしたSQLite3の動作確認」に関して解説します。
 

動作確認として、インストールしたSQLite3に接続できることを確認しましょう。



「SQLite3に接続する方法」に関しては、以下の記事「SQLite3へ接続する方法」の箇所をご覧ください。
 



以上で、「手順2:インストールしたSQLite3の動作確認」は完了です。
 

手順3:SQLite3内にテーブルを作成

「手順3:SQLite3内にテーブルを作成」に関して解説します。
 

SQLite3でUPSERTを実行するために、SQLite3内にテーブルを作成しましょう。



「SQLite3内にテーブルを作成する手順」に関しては、以下の記事をご覧ください。
 



以上で、「手順3:SQLite3内にテーブルを作成」は完了です。
 

以降の手順では、上記の記事で作成した「meibo」テーブルを想定として、手順を解説します。
 

手順4:作成したテーブルに主キーを追加

「手順4:作成したテーブルに主キーを追加」に関して解説します。
 

SQLite3でUPSERTを実行するためには、作成したテーブルに主キーを追加する必要があります。



作成したテーブルに主キーを追加するために、以下のコマンドを実行しましょう。

# ↓ SQLite3に接続 ↓
$ sqlite3 testdb.sqlite3 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.

# ↓ SQLite3内に存在するテーブルの定義を確認 ↓
sqlite> .schema
CREATE TABLE meibo (id integer, name text);

# ↓ SQLite3内に存在するmeiboテーブルを削除 ↓
drop table meibo;

# ↓ SQLite3内に主キーを持ったテーブルを作成 ↓
sqlite> CREATE TABLE meibo (id integer primary key, name text);

# ↓ SQLite3内に存在するテーブルの定義を確認 ↓
CREATE TABLE meibo (id integer primary key, name text);



コマンド実行後、「id integer primary key」が表示された場合、「正常に主キーを持ったテーブルを作成できた」と判断できます。
 

★既存テーブルに対して主キーを新規追加できない?★
SQLite3の仕様では、既存テーブルに対して、「ALTER TABLE」で後から主キーを追加できません。そのため、テーブルの再作成が必要です。

参照:ALTER TABLEで既存テーブルの構造を変更できる範囲(公式サイト)



以上で、「手順4:作成したテーブルに主キーを追加」は完了です。
 

上記の流れで、SQLite3でUPSERTを実行するための準備ができました。


 

SQLite3でUPSERTを実現する2つの方法


「SQLite3でUPSERTを実現する2つの方法」に関してご紹介します。
 

★SQLite3でUPSERTを実現する方法★
・INSERT OR REPLACE INTOを用いてUPSERTを実現する方法
・ON CONFLICTを用いてUPSERTを実現する方法



上記の方法を実施することで、「SQLite3でUPSERTを実現」できます。
 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2022年8月24日
動作確認済み環境:Ubuntu 20.04.3 LTS



以降で、上記「SQLite3でUPSERTを実現する方法」の各項目に関してご説明します。
 

INSERT OR REPLACE INTOを用いてUPSERTを実現する方法

「INSERT OR REPLACE INTOを用いてUPSERTを実現する方法」に関して解説します。
 

INSERT OR REPLACE INTO文を用いることで、SQLite3でUPSERTを実現できます。



UPSERTを実現するための、INSERT OR REPLACE INTO文の「構文」は、以下となります。

INSERT OR REPLACE INTO テーブル名 (カラム名1, カラム名2, ...) values(カラム名1の値, カラム名2の値, ...);



上記の構文をもとにして、INSERT OR REPLACE INTOを用いてUPSERTを実施してみましょう。

# ↓ SQLite3に接続 ↓
$ sqlite3 testdb.sqlite3 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.

# ↓ SQLite3内に存在するテーブルの定義を確認 (主キーが設定されていることを確認)↓
sqlite> .schema
CREATE TABLE meibo (id integer primary key, name text);

# ↓ テーブルに登録されたデータを確認 ↓
sqlite> select * from meibo;
sqlite> 

# ↓ INSERT OR REPLACE INTOを用いてUPSERTを実施 (データ登録の場合)↓
sqlite> INSERT OR REPLACE INTO meibo (id, name) values(1, 'hero');
sqlite> select * from meibo;
1|hero
sqlite> 

# ↓ INSERT OR REPLACE INTOを用いてUPSERTを実施 (データ更新の場合)↓
sqlite> INSERT OR REPLACE INTO meibo (id, name) values(1, 'tom');
sqlite> select * from meibo;
1|tom
sqlite> 



コマンド実行後、「1|tom」が表示された場合、「正常にINSErt OR REPLACE INTOを用いてUPSERTを実施できた」と判断できます。
 

★INSERT OR REPLACE INTO文のリファレンス★
INSERT OR REPLACE INTOのリファレンスは、以下に公開されています。
参照:INSERT OR REPLACE INTO文のリファレンス(公式サイト)



以上が、「INSERT OR REPLACE INTOを用いてUPSERTを実現する方法」となります。
 

ON CONFLICTを用いてUPSERTを実現する方法

「ON CONFLICTを用いてUPSERTを実現する方法」に関して解説します。
 

ON CONFLICT文を用いることで、SQLite3でUPSERTを実現できます。



UPSERTを実現するための、ON CONFLICT文の「構文」は、以下となります。

INSERT INTO テーブル名 (カラム名1, カラム名2, ...) values(カラム名1の値, カラム名2の値, ...) ON CONFLICT(主キーのカラム名) DO UPDATE SET カラム名1 = 値1, カラム名2 = 値2, ...;



上記の構文をもとにして、ON CONFLICT文を用いてUPSERTを実施してみましょう。

# ↓ SQLite3に接続 ↓
$ sqlite3 testdb.sqlite3 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.

# ↓ SQLite3内に存在するテーブルの定義を確認 (主キーが設定されていることを確認)↓
sqlite> .schema
CREATE TABLE meibo (id integer primary key, name text);

# ↓ テーブルに登録されたデータを確認 ↓
sqlite> select * from meibo;
sqlite> 

# ↓ ON CONFLICTを用いてUPSERTを実施 (データ登録の場合)↓
sqlite> INSERT INTO meibo (id, name) values(1, 'hero') ON CONFLICT(id) DO UPDATE SET name='tom';
sqlite> select * from meibo;
1|hero
sqlite> 

# ↓ ON CONFLICTを用いてUPSERTを実施 (データ更新の場合)↓
sqlite> INSERT INTO meibo (id, name) values(1, 'hero') ON CONFLICT(id) DO UPDATE SET name='tom';
sqlite> select * from meibo;
1|tom
sqlite>



コマンド実行後、「1|tom」が表示された場合、「正常にON CONFLICTを用いてUPSERTを実施できた」と判断できます。
 

★ON CONFLICT文のリファレンス★
ON CONFLICTのリファレンスは、以下に公開されています。
参照:ON CONFLICT文のリファレンス(公式サイト)



以上が、「ON CONFLICTを用いてUPSERTを実現する方法」となります。
 

上記「INSERT OR REPLACE INTO」と「ON CONFLICT」を用いることで、「SQLite3でUPSERtを実現」できました。


 

【まとめ】SQLite3でUPSERTを実現する2つの方法【最短5分】


いかがでしたでしょうか?
 

「INSERT OR REPLACE INTOとON CONFLICTを用いてUPSERTを実現する方法」を解説し、以下の悩みを解決しました。
 

★悩み★
・SQLite3において、UPSERTを実行したいけど、どのコマンドを使うの?
・そもそもUPSERTって何?
・SQLite3でUPSERTを実現する方法を知りたい。



ぜひあなたも本記事を参考に「SQLite3でUPSERT」を使ってみてください。


 

 


 

コメント