有几种方法可以将表格限制为100行。下面的代码仅显示5行,已在SQLite版本3.7.9中测试。
所有这些代码都依赖于SQLite处理数据类型声明的一种怪异方式(至少对我来说是怪异的)。SQLite允许您插入无意义的内容,例如3.14159和“wibble”到裸整数列中。但是只允许您将整数插入到声明为“integer primary key”或“integer primary key autoincrement”的列中。
外键约束
使用外键约束到有效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');
第六次插入失败,显示“错误:外键约束失败”。
我认为使用自增并不完全安全。在其他平台上,回滚会导致序列中留下空缺。如果您不使用自增,可以通过从“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)
);