INTEGER PRIMARY KEYが設定されたカラム

広告

PRIMARY KEY制約を設定する時、対象のカラムのデータ型がINTEGERだった場合だけ少し異なる挙動をします。ここではデータ型がINTEGERのカラムに対してPRIMARY KEY制約を設定した場合について解説します。

1.対象のカラムに自動的に連番で数値が格納される
2.一度使われた値の再割り当て
3.格納できる値のデータ型の制限

データ型がINTEGERのカラムに対してPRIMARY KEY制約を設定した場合、新しいデータを追加する時に対象のカラムの値を省略すると、AUTOINCREMENT制約を設定した時と同じように自動的に数値が格納されます。

CREATE TABLE テーブル名(カラム名 INTEGER PRIMARY KEY, ...);

自動的に格納される値は、対象のカラムに格納されている最大の値に1を加えた値となります。

カラムのデータ型は「INT」が含まれる場合、全てINTEGER型となりますが、連番が自動的に割り振られるのはカラムに対して「INTEGER PRIMARY KEY」と記述した場合だけです。「INT PRIMARY KEY」ではこのような特別な動作はしません)。

実際に試してみます。次のようなテーブルを作成しました。INTEGER型の「id」カラムにPRIMARY KEY制約を設定しています。

create table address(id integer primary key, name text);

p7-1

それでは「id」カラムには値を指定せずにデータをいくつか格納してみます。

insert into address(name) values('安藤');
insert into address(name) values('本田');
insert into address(name) values('山下');

p7-2

テーブルからデータを取得してみます。すると各データの「id」カラムに自動的に連番で数値が格納されていることが確認できます。

p7-3

値を省略せずに任意の数値を格納することもできます。(PRIMARY KEY制約が設定されていますので重複する値は格納できません)。

p7-4

次に「id」カラムに値を指定せずにデータを追加すると、「id」カラムには現在格納されている中で最大の値である「10」の次の値である「11」が自動的に格納されます。

p7-5

INTEGER PRIMARY KEYが設定されたカラムの場合、データを追加する時に値を省略すると自動的に数値が設定されますが、以前に別のデータで格納されていた値(データは削除済)と同じ値が割り当てられることがあります。

次の例で解説します。現在5つのデータが格納されており、格納済のデータの中で「id」カラムの値が一番大きいものは「11」です。

p7-6

では最後のデータをテーブルから削除してみます。

p7-7

新しいデータを追加します。「id」カラムは値を指定しないで下さい。データを追加後にテーブルからデータを取得してみると、再度に追加したデータの「id」カラム値が過去に追加されたことがある「11」となっています。

p7-8

もし一度使われた値は二度使われないようにしたい場合は「AUTOINCREMENT」制約を使用して下さい。

SQLiteではテーブル作成時にカラムにデータ型を指定した場合でも、他のデータ型を格納してもエラーにはなりません。例えばINTEGER型を設定したカラムに対してTEXT型の値を格納する事も可能です。

p7-9

カラムに対してデータ型としてINTEGERを指定し、PRIMARY KEY制約を設定した場合はこのカラムには整数しか格納することはできなくなります。

p7-10

上記ではINTEGER PRIMARY KEYが指定されているカラムに対し、最初のデータは数値の「5」を格納したため成功しましたが、3番目のデータは「hello」とうTEXT型の値を格納しようとしたため「Error: datatype mismatch」というエラーが表示されました。

なおTEXT型の値であっても例えば「'10'」のような値であれば、INTEGER型が設定されているカラムに格納する時点でINTEGER型の10に変換されてから格納されるためエラーとはなりません。

データ型が設定されたカラムに様々なデータ型の値を格納した時にどのように変換されて格納されるのかについては「SQLiteで利用可能なデータ型」を参照して下さい。

( Written by Tatsuo Ikura )