INTEGER PRIMARY KEYが設定されたカラム
カラムに対してPRIMARY KEY制約を設定することができますが、そのカラムのデータ型がINTEGERだった場合には自動的に連続する数値が格納されるようになります。
CREATE TABLE テーブル名(カラム名 INTEGER PRIMARY KEY, ...);
テーブルにデータを追加する時に、対象のカラムに値を代入しないとそのカラムに格納されている最大の値に1を加えた値がカラムの値として格納されます。
例えば次のようなテーブルを作成し、データを3行追加してみます。
create table address(id integer primary key, name text);
insert into address(name) values('安藤');
insert into address(name) values('本田');
insert into address(name) values('山下');
「id」カラムには値を設定していないので、順番に「1」「2」「3」という値が格納されることになります。
「id」カラムにはPRIMARY KEY制約が設定されていますので重複する値は格納できませんが、重複しなければ任意の値を格納することはもちろん可能です。
次に改めて「id」カラムの値を指定せずにデータを追加すると、現在「id」カラムに格納されている最大の値は「14」ですのでそれに1を加えた「15」が格納されることになります。
このようにデータ型がINTEGERでPRIMARY KEY制約が設定されているカラムでは自動的に連番が格納されるようになります。
一度使われた値の再割り当て
注意すべき点としては、一度使用された値が、その値が格納されたデータが削除され使用されなくなると、再度同じ値が他のデータに割り当てられる可能性があることです。
次の例を見てください。
上記では「id」カラムの値が「15」の行を削除しています。この時点で「id」カラムの最大値は「14」となります。
ここで改めて「id」カラムの値を指定せずにデータを追加してみます。
データを追加前の「id」カラムの最大値は「14」でしたので、新しく追加したデータの「id」カラムの値は「14」に1を加えた「15」となります。このように一度割り当てられた値であってもデータの削除などで使われなくなれば再度他のデータに割り当てられる可能性があります。
もし一度使われた値は二度使われないようにしたい場合は次のページで説明する「AUTOINCREMENT」キーワードを使用して下さい。
格納できる値のデータ型の制限
SQLiteではカラムに対してデータ型を指定した場合でも、どのようなデータ型を持つ値でも格納することができます。例えばINTEGER型を設定したカラムに対してTEXT型の値を格納する事も可能です。
ただしカラムに対してデータ型としてINTEGERを指定し、PRIMARY KEY制約を設定した場合だけ例外となりこのカラムには整数しか格納することはできません。
上記ではINTEGER PRIMARY KEYが指定されているカラムに対して'seven'というTEXT型の値を格納しようとしました。この場合「SQL error: datatype mismatch」というエラーが表示されます。
なお正確には整数または整数に変換することができる値だけ格納することができます。TEXT型の値であっても例えば'10'のような値であれば、INTEGER型が設定されているカラムに格納する時点でINTEGER型の10に変換されてから格納されるためエラーとはなりません。
データ型が設定されたカラムに様々なデータ型の値を格納した時にどのように変換されて格納されるのかについては「SQLiteで利用可能なデータ型」を参照して下さい。