SQlite3 自動採番の備忘録 
2014/02/13 Thu.
データベースには自動採番という機能がある。
PostgreSQLなら「SERIAL」というデータ型を指定すると、データをINSERTするたびに自動的に1、2、3、と数値が振られていく。
SQlite3にも同じような機能があるのだが、PostgreSQLのようにシンプルではないので備忘録。
PostgreSQLなら「SERIAL」というデータ型を指定すると、データをINSERTするたびに自動的に1、2、3、と数値が振られていく。
SQlite3にも同じような機能があるのだが、PostgreSQLのようにシンプルではないので備忘録。
まず、SQliteでは型宣言がintegerとintで違いがある。
どちらも整数型と言う点では同じなのだが、PostgreSQLでいうところのSERIALのように、自動的に連番を付加しようと思うと、INTEGER PRIMARY KEYと書かなくてはならない。
「え?自動採番機能はいらないけど、整数型でプライマリー・キー指定をしたい!」
という場合はINT PRIMARY KEYとする。その場合、PRIMARY KEY制約だけが付加される。
なるほど。
しかし、ポスグレとの違いはまだある。
PostgreSQLのSERIALと同じ機能にするには、INTEGER PRIMARY KEY AUTOINCREMENT を指定しなきゃだめなのです。
どういうことかというと、自動採番をする点は同じですが、AUTOINCREMENT を付加しない場合は同じ数字を再度使用することがある。
例えば、次のようなテーブルを用意する。
create table test (
a integer primary key,
b text
);
このテーブルに
insert into test (b) values ('A');
insert into test (b) values ('B');
insert into test (b) values ('C');
とすると、
a = 1 : b = 'A'
a = 2 : b = 'B'
a = 3 : b = 'C'
とデータが格納される。
ここで、「a = 3」の行をDELETEし、
insert into test (b) values ('D');
とすると、
a = 1 : b = 'A'
a = 2 : b = 'B'
a = 3 : b = 'D'
このように、再び「3」から始まる。
しかし、PostgreSQLのSERIALではすでに採番された「3」は欠番扱いになり、次は「4」から採番されるし、そのほうが都合がいいことも多い。
そこで、AUTOINCREMENTを指定すると、すでに採番した値は欠番扱いになり、この場合なら「4」から採番が始まるようになります。
自動採番される場合でも、連番項目に強制的に数値を入れたいこともある。
その場合、今後の採番はどうなるのか?
大丈夫。
INSERTで強制的に数値を入れると、その数値が最大値として記憶され、次にINSERTを実行すると、その数値+1が採番される。
SQlite3では自動採番制御専用テーブル「sqlite_sequence」というのがあります。
中を見たいときは普通に
select * from sqlite_sequence;
としてください。
どちらも整数型と言う点では同じなのだが、PostgreSQLでいうところのSERIALのように、自動的に連番を付加しようと思うと、INTEGER PRIMARY KEYと書かなくてはならない。
「え?自動採番機能はいらないけど、整数型でプライマリー・キー指定をしたい!」
という場合はINT PRIMARY KEYとする。その場合、PRIMARY KEY制約だけが付加される。
なるほど。
しかし、ポスグレとの違いはまだある。
PostgreSQLのSERIALと同じ機能にするには、INTEGER PRIMARY KEY AUTOINCREMENT を指定しなきゃだめなのです。
どういうことかというと、自動採番をする点は同じですが、AUTOINCREMENT を付加しない場合は同じ数字を再度使用することがある。
例えば、次のようなテーブルを用意する。
create table test (
a integer primary key,
b text
);
このテーブルに
insert into test (b) values ('A');
insert into test (b) values ('B');
insert into test (b) values ('C');
とすると、
a = 1 : b = 'A'
a = 2 : b = 'B'
a = 3 : b = 'C'
とデータが格納される。
ここで、「a = 3」の行をDELETEし、
insert into test (b) values ('D');
とすると、
a = 1 : b = 'A'
a = 2 : b = 'B'
a = 3 : b = 'D'
このように、再び「3」から始まる。
しかし、PostgreSQLのSERIALではすでに採番された「3」は欠番扱いになり、次は「4」から採番されるし、そのほうが都合がいいことも多い。
そこで、AUTOINCREMENTを指定すると、すでに採番した値は欠番扱いになり、この場合なら「4」から採番が始まるようになります。
自動採番される場合でも、連番項目に強制的に数値を入れたいこともある。
その場合、今後の採番はどうなるのか?
大丈夫。
INSERTで強制的に数値を入れると、その数値が最大値として記憶され、次にINSERTを実行すると、その数値+1が採番される。
SQlite3では自動採番制御専用テーブル「sqlite_sequence」というのがあります。
中を見たいときは普通に
select * from sqlite_sequence;
としてください。
- 関連記事
category: データベース
この記事へのコメント
コメントの投稿
コメントは全て管理人が内容を確認してから表示されます(非公開コメント除く)。
内容によっては表示されない場合がありますことご了承願います。
内容によっては表示されない場合がありますことご了承願います。
« Sqlite3でDELETEを実行したけど戻り値FALSEで実行されない。
PostgreSQLとSQLite3とPDO »