2016-07-22 134 views
2

我发现了硬性规定视图没有rowid,这是预期的吗?这是一个简化的例子。sqlite视图没有rowid值

create table t2 (u text); 
insert into t2 values ('x'); 
insert into t2 values ('y'); 
create table t1 (t text, i integer); 
insert into t1 values ('a',1); 
insert into t1 values ('b',2); 
insert into t1 values ('c',1); 
insert into t1 values ('d',2); 
create view v as select * from t1 join t2 on t1.i=t2.rowid; 
select rowid,* from t1; 
ro t i 
-- -- -- 
1 a 1 
2 b 2 
3 c 1 
4 d 2 
select rowid,* from v; 
ro t i u 
-- -- -- ---------- 
    a 1 x 
    b 2 y 
    c 1 x 
    d 2 y 

我通过给t1添加'ID'列来解决这个问题,其中ID = rowid。

我在sqlite VIEW网页上做了一个快速^ F'rowid',发现没有引用rowid。在它的快速谷歌给出了许多关于NO ROWID的匹配,所以我没有找到答案。

我想知道我是否滥用了该视图。基本上,这个视图是我提供将单个表连接在一起的单个表的一种方式。然而,我需要通过'rowid'访问视图。为了避免关于为什么使用rowid而不是ID列的说法,原因是我的表是一次写入(通过数据提取器),然后是只读的。数据提取器知道它输入了什么,然后知道rowid,然后避免创建一个冗余列。

回答

2

rowid值标识表行;视图没有存储行。

为了从视图中使用的表识别的行,则可以简单地包括从该表在视图中rowid值:

CREATE VIEW v AS SELECT t1.rowid, ... FROM t1 ...; 

无论如何,声明为INTEGER PRIMARY KEY列是别名为rowid(因此不需要额外的存储)。 如果你真的想使用rowid值,这将是一个更好的主意,包括明确表定义这样的列:

CREATE TABLE t1 (
    id INTEGER PRIMARY KEY, 
    t TEXT, 
    i INTEGER 
); 

(它仍然表现为rowid;您通过插入NULL值获得autoincremented values进入它。)

+0

Thanx,我错过了主要关键技巧。我确实添加了一个ID列,并在那里重复了rowid。 Thanx为NULL值插入技巧,我的数据提取器知道ID但尚未绑定它插入,而NULL将删除绑定。好东西 :) – Phi