テーブルを 100 行に制限するには、いくつかの方法があります。(簡潔にするために、以下のコードでは 5 行です。) SQLite バージョン 3.7.9 でテスト済み。
このすべてのコードは、SQLite がデータ型宣言を処理する方法の一種の癖に依存しています。(とにかく、私には奇妙に思えます。) SQLite では、3.14159 や「ウィブル」などのナンセンスをそのままの整数列に挿入できます。integer primary key
ただし、 orと宣言された列に挿入できるのは整数のみですinteger primary key autoincrement
。
FOREIGN KEY 制約
有効な ID 番号のテーブルに外部キー制約を使用して、ID 番号が必要な範囲内にあることを保証します。外部キー制約は、自動インクリメント列でも機能します。
pragma foreign_keys=on;
create table row_numbers (n integer primary key);
insert into row_numbers values (1);
insert into row_numbers values (2);
insert into row_numbers values (3);
insert into row_numbers values (4);
insert into row_numbers values (5);
create table test_row_numbers (
row_id integer primary key autoincrement,
other_columns varchar(35) not null,
foreign key (row_id) references row_numbers (n)
);
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
6 回目の挿入は「エラー: 外部キー制約に失敗しました」で失敗します。
自動インクリメントの使用が完全に安全だとは思いません。他のプラットフォームでは、ロールバックによってシーケンスにギャップが残ります。自動インクリメントを使用しない場合は、「row_numbers」から ID 番号を選択することで安全に行を挿入できます。
insert into test_row_numbers values
(
(select min(n)
from row_numbers
where n not in
(select row_id from test_row_numbers)),
's'
);
CHECK() 制約
以下の主キー制約により、ID 番号が整数になることが保証されます。CHECK() 制約は、整数が正しい範囲にあることを保証します。アプリケーションは、ロールバックによって生じるギャップにまだ対処しなければならない場合があります。
create table test_row_numbers (
row_id integer primary key autoincrement,
other_columns varchar(35) not null,
check (row_id between 1 and 5)
);