ラベル last_insert_rowid の投稿を表示しています。 すべての投稿を表示
ラベル last_insert_rowid の投稿を表示しています。 すべての投稿を表示

2026年7月20日月曜日

SQLite3 最後に挿入された rowid を確認する(last_insert_rowid)

概要

現在のデータベース接続で一番最後に挿入されたレコードのrowidの値を取得するには last_insert_rowid関数を使用する。

構文


last_insert_rowid()
                

実行例

環境
  • Windows 11
  • SQLite3 (3.53.3) Command-Line Shell
  1. 最後に挿入したレコードのrowidが取得される
  2. 一括で挿入した際も最後のrowidが取得される
  3. 他のテーブルに挿入した場合はそちらで挿入したrowidが取得される

sqlite> create table user (id, name);
sqlite> create table product (id, name, quantity);

sqlite> -- 1.
sqlite> insert into user (id, name) values ('001', 'sample_user_001');
sqlite> select rowid, * from user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '001' │ sample_user_001 │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   1 │
╰─────────────────────╯

sqlite> -- 2. 
sqlite> insert into user (id, name) values ('002', 'sample_user_002'), ('003', 'sample_user_003');
sqlite> select rowid, * from user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '001' │ sample_user_001 │
│     2 │ '002' │ sample_user_002 │
│     3 │ '003' │ sample_user_003 │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   3 │
╰─────────────────────╯

sqlite> --3.
sqlite> insert into product (id, name, quantity) values ('001', 'tomato', 100);
sqlite> select rowid, * from product;
╭───────┬───────┬────────┬──────────╮
│ rowid │  id   │  name  │ quantity │
╞═══════╪═══════╪════════╪══════════╡
│     1 │ '001' │ tomato │      100 │
╰───────┴───────┴────────┴──────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   1 │
╰─────────────────────╯
sqlite>

                

last_insert_row()で取得できるのは あくまで「新規挿入」された時のrowidであり、 たとえばupdateで更新された際の値は無視される。


sqlite> select rowid, * from product;
╭───────┬───────┬────────┬──────────╮
│ rowid │  id   │  name  │ quantity │
╞═══════╪═══════╪════════╪══════════╡
│     1 │ '001' │ tomato │      100 │
╰───────┴───────┴────────┴──────────╯
sqlite> insert into user (id, name) values ('004', 'sample_user_004');
sqlite> select rowid, * from user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '001' │ sample_user_001 │
│     2 │ '002' │ sample_user_002 │
│     3 │ '003' │ sample_user_003 │
│     4 │ '004' │ sample_user_004 │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   4 │
╰─────────────────────╯
sqlite> update user set rowid = '999' where id = '004';
sqlite> select rowid, * from user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '001' │ sample_user_001 │
│     2 │ '002' │ sample_user_002 │
│     3 │ '003' │ sample_user_003 │
│   999 │ '004' │ sample_user_004 │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   4 │
╰─────────────────────╯
sqlite>
                

DBをattachした場合の挙動

attachコマンドを使えば複数のDBを同時に操作できる。 この場合もlast_insert_rowid()は接続先のDBを問わず、 一番 最近insertした際のrowidが返される。


C:\temp>sqlite3 test01.db
SQLite version 3.53.3 2026-06-26 20:14:12
Enter ".help" for usage hints.
sqlite> insert into user (id, name) values ('005', 'sample_user_005');
sqlite> select rowid, * from user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '001' │ sample_user_001 │
│     2 │ '002' │ sample_user_002 │
│     3 │ '003' │ sample_user_003 │
│     4 │ '004' │ sample_user_004 │
│     5 │ '005' │ sample_user_005 │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   5 │
╰─────────────────────╯
sqlite> attach database "test02.db" as test02;
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   5 │
╰─────────────────────╯
sqlite> insert into test02.user (id, name) values ('006', 'sample_user_006');
sqlite> select rowid, * from test02.user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '006' │ sample_user_006 │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   1 │
╰─────────────────────╯
sqlite>
                

コネクション作成直後は0になる

last_insert_rowid()はあくまで 現在の接続で最後に挿入されたデータのrowidを取得するので、 一度 接続を切ればリセットされて最初は0を返す。


sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   6 │
╰─────────────────────╯
sqlite> .quit
C:\temp>sqlite3 test01.db
SQLite version 3.53.3 2026-06-26 20:14:12
Enter ".help" for usage hints.
sqlite> select rowid, * from user;
╭───────┬───────┬─────────────────╮
│ rowid │  id   │      name       │
╞═══════╪═══════╪═════════════════╡
│     1 │ '001' │ sample_user_001 │
│     2 │ '002' │ sample_user_002 │
│     3 │ '003' │ sample_user_003 │
│     4 │ '004' │ sample_user_004 │
│     5 │ '005' │ sample_user_005 │
│     6 │ '007' │ sample          │
╰───────┴───────┴─────────────────╯
sqlite> select last_insert_rowid();
╭─────────────────────╮
│ last_insert_rowid() │
╞═════════════════════╡
│                   0 │
╰─────────────────────╯
                

参考URL