我发现视图没有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
我通过添加“ID&ID”来解决这个问题。列到t1,其中ID = rowid。
我做了一个快速的'F' rowid'在sqlite VIEW网页上找不到对rowid的引用。一个快速谷歌给它提供了许多关于NO ROWID的比赛,所以我没有找到答案。
我想知道我是否误用了这个观点。基本上,视图是我提供一种将几个相关表链接在一起的表的方法。但我需要通过其“rowid”来访问该视图。为了避免讨论为什么使用rowid而不是ID列,原因是我的表是一次写入(通过数据提取器)然后是只读的。数据提取器知道它输入了什么,然后知道rowid,然后避免创建冗余列。
答案 0 :(得分:3)
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。)