您可以使用 SQL DDL 中的 CHECK 约束来限制行数。您的应用程序将不得不捕获由于尝试添加太多行而导致的错误。您的应用程序还必须捕获其他错误。磁盘已满,使用 NULL 等。
关键点似乎是保证整数 ID 号实际上是一个整数。SQLite 的类型亲和性让您可以将废话插入整数列。
sqlite> create table foo (n integer);
sqlite> insert into foo values ('wibble');
sqlite> select n from foo;
wibble
但是 typeof() 函数可以保护你免于胡说八道。
typeof() 函数是一个 SQLite 函数。它不是标准的 SQL,所以如果你移动到另一个 dbms,你将不得不重写下面的 CHECK 约束。(不太可能,因为您正在为 android 编程,但其他看到这一点的人可能在不同的环境中工作。)
create table test_limit (
n integer primary key
check (
(typeof(n)='integer') and
(n >=1 and n <= 10)
)
);
Usingtypeof(n)
允许只插入整数。范围条件限制了您可以插入的整数数量。在 3.7.9 版本中进行了简要测试。
sqlite> insert into test_limit values (1.13);
Error: datatype mismatch
sqlite> insert into test_limit values (-2);
Error: constraint failed
sqlite> insert into test_limit values ('wibble');
Error: datatype mismatch
sqlite> insert into test_limit values (1);
sqlite> insert into test_limit values (2);
sqlite> insert into test_limit values (17);
Error: constraint failed
之后...
如果您的目标可以表示为“将列 'id' 限制为从 1 到 10 的整数”,这似乎是一个简单、可行的解决方案。我对你的代码有一些自由,所以我可以直接在 SQLite 中工作。您应该仔细查看非关键列。由于您没有自然键(除了 id 号之外,没有一组列是唯一的),因此您实际上并没有太多的表。下面我的 SQL 插入应该可以清楚地说明这个问题,但这与将表限制为 10 行是不同的问题。
create table test_limit (
id integer primary key autoincrement,
site text not null,
address text not null,
username text not null,
password text not null,
check (
typeof(id) = 'integer' and
(id >= 1 and id <= 10)
)
);
-- 10 inserts.
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
尝试重复其中一个插入会导致Error: constraint failed
. 尝试在“id”列中插入除整数以外的任何内容都会失败,并显示Error: datatype mismatch
.