有有几种方法可以将约束为一个表格到100行。 (为了简洁起见,下面的代码中有5行。)在SQLite 3.7.9版本中测试。
所有这些代码都依赖于SQLite处理数据类型声明的一种怪癖。 (无论如何,这对我来说似乎很古怪。)SQLite允许你像3.14159和'wibble'一样插入一个无用的数据到一个裸整数列中。但它可以让你只将整数插入到一个名为integer primary key
或integer primary key autoincrement
的列中。
外键约束
使用外键约束有效身份证件号码表,以保证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)
);
我想我错过了一些东西,但不会总是只更新最后一行?我想我在原来的文章中忘记提到了,但我想举例说明最后的5个动作/事件,不管他们多大年纪,而不仅仅是最后一个。不过谢谢。 – 2010-01-10 03:39:27
@Blaenk:假设你的更新将datetime字段设置为它触及的每一行的当前时间,这应该按照时间顺序循环行。 – 2010-01-10 03:47:48
Oohhh,然后还更新日期时间字段当然,这会使它成为最新的一行,对吗?我懂了。嗯,这很有趣。是否有预先创建一定数量的“虚拟”行的简单方法? – 2010-01-10 04:01:35