概要 :このチュートリアルでは、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 full
Code language: SQL (Structured Query Language) (sql)
AUTOINCREMENT
はいつ使用する必要がありますか 列属性?
属性AUTOINCREMENT
を使用する主な目的 SQLiteが使用されていない値または以前に削除された行の値を再利用しないようにするためです。
このような要件がない場合は、AUTOINCREMENT
を使用しないでください。 主キーの属性。
このチュートリアルでは、SQLiteのAUTOINCREMENT
属性が機能し、SQLiteが主キー列に値を割り当てる方法にどのように影響するか。