SQLiteには、自動インクリメント列を処理する興味深い方法があります。列を自動インクリメントするということは、新しいデータが挿入されるたびに自動的にインクリメントする列を意味します。
これはIDENTITY
に似ています SQLServerの列またはAUTO_INCREMENT
MySQL
の列 。
この記事では、AUTOINCREMENT
を作成する方法について説明します SQLiteの列。
自動インクリメント列を自動的に作成
デフォルトでは、列をINTEGER PRIMARY KEY
として定義する場合 、その列にNULLを挿入するたびに自動インクリメントされます。
例:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
この表では、 CatId columnは自動インクリメント列です。これは、INTEGER PRIMARY KEY
を使用して定義されているためです。 。
ここで、その列にNULLを挿入すると、 CatId 列の自動インクリメント:
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
SELECT * FROM Cats;
結果:
CatId CatName ---------- ---------- 1 Brush 2 Scarcat 3 Flutter
AUTOINCREMENT
を上書きできることに注意してください。 独自の値を挿入して値を設定します。つまり、AUTOINCREMENT
そうでない場合にのみ値を挿入します。
それが機能する方法は、NULL
テーブル内の他のすべての行よりもその列の最大値より1大きい整数に自動的に変換されます。テーブルが空の場合、値は1
になります 。
列の最大値が可能な最大の整数(9223372036854775807)である場合、SQLiteは未使用のキーをランダムに選択します。これは通常、以前に削除された古いキーを再利用することを意味します。未使用のキーが見つからない場合は、INSERT
SQLITE_FULL
で操作が失敗する エラー。
基本的に、これが意味するのは、DELETE
を許可した場合です。 テーブル内の操作の場合、すべての行が順番に並んでいるという保証はありません。一部の行は、後日挿入された行よりも高い値になる可能性があります。
したがって、このような場合、行が挿入された順序に基づいてテーブルを昇順または降順で並べ替える必要がある場合は、この列に依存することはできません。
幸い、これが問題になる場合は、解決策があります。AUTOINCREMENT
キーワード。
AUTOINCREMENTキーワードを使用する
または、AUTOINCREMENT
を使用して、列を自動インクリメントに明示的に設定することもできます。 キーワード。
この方法を使用する利点の1つは、すべての行が昇順になることが保証されることです。これは、以前に削除されたキーを再利用しないためです。各キーは常に、そのテーブルにこれまでに存在した最大のキーより1つ多くなります。可能な限り最大のキーが以前にそのテーブルに存在していた場合、そのキーは存在しません 以前に削除したキーを使用してみてください。 INSERT
SQLITE_FULL
で失敗します エラーコード。
AUTOINCREMENT
を使用することの欠点 キーワードは、余分なCPU、メモリ、ディスクスペース、およびディスクI/Oオーバーヘッドを使用することです。
AUTOINCREMENT
を使用して自動インクリメント列を作成する例を次に示します。 キーワード:
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY AUTOINCREMENT,
DogName
);
次に、データを挿入して選択します:
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' ),
( NULL, 'Fluff' );
SELECT * FROM Dogs;
結果:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer 3 Fluff
綿毛を削除した場合 このテーブルから、新しい行を挿入します(NULL
を使用) DogIdとして)、新しいDogIdは4になります。つまり、3を再利用しません。
列がなしで作成された場合 AUTOINCREMENT
キーワードの場合、次の行は3のDogIdを再利用します。
9223372036854775807(可能な最大の整数)のDogIdを挿入すると、次の挿入時にNULL
を指定する次のエラーが発生します。 その列の場合:
Error: database or disk is full
ただし、その値が別の行でまだ使用されていない限り、9223372036854775807よりも小さい値を明示的に挿入できます。INSERT
上記のエラーなしで操作は成功するはずです。
基本的に、9223372036854775807に達すると、自動インクリメントは機能しなくなります。
AUTOINCREMENT
なしで定義された列 キーワードにはこの問題はありません。彼らは自動的に戻って、代わりに使用する未使用の整数を見つけようとします。ただし、すべての整数が使用されている場合(つまり、テーブルに実際に9223372036854775807行が含まれている場合)、それらの列でも上記のエラーが発生します。