sqlite视图没有rowid值

时间:2016-07-22 05:56:33

标签: sqlite sql-view

我发现视图没有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,然后避免创建冗余列。

1 个答案:

答案 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。)