概要
現在のデータベース接続で一番最後に挿入されたレコードのrowidの値を取得するには
last_insert_rowid関数を使用する。
構文
last_insert_rowid()
実行例
環境
- Windows 11
- SQLite3 (3.53.3) Command-Line Shell
- 最後に挿入したレコードの
rowidが取得される - 一括で挿入した際も最後の
rowidが取得される - 他のテーブルに挿入した場合はそちらで挿入した
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
-
公式のlast_insert_rowid()に関するドキュメント
https://sqlite.org/lang_corefunc.html#last_insert_rowid