SQLite3虚拟表而不是空

时间:2015-07-23 04:12:18

标签: sqlite

我似乎在SQLite3中遇到了虚拟表问题。

创建表格:

CREATE TABLE Test1 (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Value TEXT);
CREATE VIRTUAL TABLE Test2 USING fts4 (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Value TEXT);

正如您所看到的,它们基本相同,只有一个是Virtual for FTS4支持。

INSERT INTO Test1 (Value) values("test");
INSERT INTO Test2 (Value) values("test");

测试1的结果:

id          Value     

---------- ----------

1           test 

测试2的结果:

id          Value     

---------- ----------

            test

有没有办法让SQLite3强制虚拟表的NOT NULL特性?

谢谢!

2 个答案:

答案 0 :(得分:1)

我相信您可以使用标准和虚拟SQLite表中提供的rowid列来实现您的目标。

CREATE VIRTUAL TABLE Test2 USING fts4 (Value TEXT);

如果要插入新记录,只需将null作为rowid的值传递:

INSERT INTO Test2(rowid, Value) VALUES(null, 'hello');

当插入值为rowid时,SQLite中用于分配null的默认行为是将先前的最大值增加1.这与使用{{{ 1}}。

要获得桌面查询中的AUTOINCREMENT,您可以尝试以下内容:

rowid

以下是link to the SQLite documentation,其中讨论SELECT rowid, * FROM Test2; null的行为。而here is a link提到FTS表确实有rowid列,就像常规表一样。

答案 1 :(得分:0)

虚拟表不是由SQLite本身实现的,而是由一些单独的代码实现的。

FTS模块不支持数据类型或约束;它的虚拟表只有纯文本列,并且所有列(包括您的id列)都被编入索引以进行全文搜索。

documentation所示,FTS表有一个隐含的INTEGER PRIMARY KEY列,可以docidrowid访问。