我似乎在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特性?
谢谢!
答案 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列,可以docid
或rowid
访问。