SQLiteにはlast_insert_rowid()
という関数があります これは、関数を呼び出したデータベース接続から挿入された最後の行のROWIDを返します。
例
last_insert_rowid()
がどのように行われるかを示す例を次に示します。 関数はSQLiteで動作します。
まず、テーブルを作成してデータを挿入しましょう:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
これにより、各行のROWIDが自動的に作成されます。したがって、このSQLステートメントは3つの異なるROWIDを作成します。 1、2、および3。
これで、last_insert_rowid()
を使用できます 最後のROWIDの値を返す関数。
SELECT last_insert_rowid();
結果:
3
予想どおり、最後のROWIDは3です。
別のテーブルに挿入
last_insert_rowid()
に注意してください テーブルレベルではなく、データベース接続に基づいて機能します。
したがって、新しいテーブルを作成してから、そのテーブルに行を挿入すると、last_insert_rowid()
値はそのに基づきます 挿入操作。
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY,
DogName
);
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' );
SELECT last_insert_rowid();
結果:
2
ちなみに、テーブルを作成したときに、最初の列を自動インクリメント列として定義しました。これは、INTEGER PRIMARY KEY
を使用したときに暗黙的に定義されました。 。
したがって、すべての行を選択すると、最後の行にlast_insert_rowid()
が含まれていることがわかります。 その列の値。
SELECT * FROM Dogs;
結果:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer
SQLiteでは、タイプINTEGERPRIMARYKEYの列はROWIDのエイリアスです。
次のクエリはこれを示しています。
SELECT
rowid,
*
FROM Dogs;
結果:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer
組み込みのSQLite自動インクリメント機能を使用せずに列を作成できることに注意してください。これを行うと、「ID」列の値がROWID値と異なる可能性があります。
自動インクリメント値を独自の明示的な値でオーバーライドすることもできます。ただし、この場合、ROWID値は引き続きこの明示的な値を反映します。
INSERT INTO Dogs
VALUES ( 789, 'Fluff' );
SELECT
rowid,
*
FROM Dogs;
SELECT last_insert_rowid();
結果:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer 789 789 Fluff
そしてもちろん、last_insert_rowid()
この最新のROWID値も反映されます。
SELECT last_insert_rowid();
結果:
789
ROWIDとは何ですか?
ROWIDは、テーブル内の行を一意に識別する64ビットの符号付き整数キーです。テーブルがWITHOUT ROWID
を使用して定義されていない限り、SQLiteのすべてのテーブルにはROWIDがあります 。
ROWID値には、大文字と小文字を区別しない特殊な名前rowid
のいずれかを使用してアクセスできます。 、oid
、または_rowid_
列名の代わりに。これらの名前のいずれかを使用するユーザー定義の列がテーブルに含まれている場合、その名前は常に明示的に宣言された列を参照し、整数のROWID値を取得するために使用することはできません。
自動インクリメント列を使用してテーブルを定義すると、その列はその行にROWID値を自動的に使用します。
詳細については、SQLiteでのAUTOINCREMENTの動作を参照してください。