概要 :このチュートリアルでは、SQLite AUTOINCREMENTについて学習します 列属性とそれをテーブルでいつ使用するか。
SQLite ROWIDの紹介 テーブル
WITHOUT ROWIDを指定せずにテーブルを作成するときはいつでも オプションを選択すると、rowidという暗黙の自動インクリメント列が表示されます。 。 rowid 列は、テーブル内の行を一意に識別する64ビットの符号付き整数を格納します。
次の例を見てみましょう。
まず、peopleという名前の新しいテーブルを作成します first_name, の2つの列があります およびlast_name :
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql) 試してみてください
次に、peopleに行を挿入します 次のINSERTを使用したテーブル ステートメント:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');Code language: SQL (Structured Query Language) (sql) 試してみてください
第三に、peopleからデータをクエリします 次のSELECTを使用したテーブル ステートメント:
SELECT
rowid,
first_name,
last_name
FROM
people;Code language: SQL (Structured Query Language) (sql) 試してみてください
出力から明らかなように、SQLiteは暗黙的にrowidという名前の列を作成します テーブルに新しい行を挿入するたびに、整数値が自動的に割り当てられます。
rowidも参照できることに注意してください エイリアスを使用する列:_rowid_ およびoid 。
INTEGER PRIMARY KEYを持つテーブルを作成する場合 列、この列はrowidのエイリアスです 列。
次のステートメントは、テーブルpeopleを削除します そしてそれを再作成します。ただし、今回はperson_idという名前の別の列を追加します データ型がINTEGER 列の制約はPRIMARY KEYです。 :
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql) 試してみてください
この場合、person_id 列は実際にはrowid 列。
SQLiteはどのようにしてrowidに整数値を割り当てますか 列?
rowidを指定しない場合 値またはNULLを使用します 新しい行を挿入すると、SQLiteは最大のrowidより1つ大きい次の連続した整数を自動的に割り当てます。 テーブルで。 rowid 値は1から始まります。
rowidの最大値 列は9,223,372,036,854,775,807です 、非常に大きいです。データがこの最大値に達したときに新しい行を挿入しようとすると、SQLiteは未使用の整数を見つけてそれを使用します。 SQLiteが未使用の整数を見つけられない場合、SQLITE_FULLを発行します エラー。その上、いくつかの行を削除して新しい行を挿入すると、SQLiteはrowidを再利用しようとします 削除された行の値。
テストしてみましょう。
まず、最大値の行をpeopleに挿入します テーブル。
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql) 試してみてください
次に、person_idの値を指定せずに別の行を挿入します 列:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');Code language: SQL (Structured Query Language) (sql) 試してみてください
出力に明確に示されているように、新しい行は未使用の整数を受け取りました。
別の例を考えてみましょう。
まず、t1という名前の新しいテーブルを作成します 1つの列があります:
CREATE TABLE t1(c text);Code language: SQL (Structured Query Language) (sql)
次に、いくつかの行をt1に挿入します テーブル:
INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)
第三に、t1からデータをクエリします テーブル:
SELECT rowid, c FROM t1;Code language: SQL (Structured Query Language) (sql)
第4に、t1のすべての行を削除します テーブル:
DELETE FROM t1;Code language: SQL (Structured Query Language) (sql)
5番目に、t1にいくつかの行を挿入します テーブル:
INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');Code language: SQL (Structured Query Language) (sql)
最後に、t1からデータをクエリします テーブル:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
ご覧のとおり、ROWID 1、2、および3は新しい行に再利用されています。
SQLite AUTOINCREMENT 列属性
SQLiteでは、AUTOINCREMENTを使用しないことをお勧めします 属性理由:
AUTOINCREMENTキーワードは、余分なCPU、メモリ、ディスクスペース、およびディスクI / Oオーバーヘッドを課すため、厳密に必要でない場合は回避する必要があります。通常は必要ありません。
さらに、SQLiteがAUTOINCREMENTに値を割り当てる方法 rowidの場合とは少し異なる列 列。
次の例を考えてみましょう。
まず、peopleを削除して再作成します テーブル。今回はAUTOINCREMENTを使用します 属性列:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name text NOT NULL,
last_name text NOT NULL
);Code language: SQL (Structured Query Language) (sql) 試してみてください
次に、rowidが最大の行を挿入します peopleへの価値 テーブル。
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql) 試してみてください
3番目に、peopleに別の行を挿入します テーブル。
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');Code language: SQL (Structured Query Language) (sql) 試してみてください
今回は、person_idが原因で、SQLiteがエラーメッセージを発行しました。 列はrowidのように番号を再利用しませんでした 列。
[Err] 13 - database or disk is fullCode language: SQL (Structured Query Language) (sql)
AUTOINCREMENTはいつ使用する必要がありますか 列属性?
属性AUTOINCREMENTを使用する主な目的 SQLiteが使用されていない値または以前に削除された行の値を再利用しないようにするためです。
このような要件がない場合は、AUTOINCREMENTを使用しないでください。 主キーの属性。
このチュートリアルでは、SQLiteのAUTOINCREMENT 属性が機能し、SQLiteが主キー列に値を割り当てる方法にどのように影響するか。