sqlite 视图没有 rowid 值

sqlite views have no rowid values

我发现视图没有 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=rowid 的 t1 添加一个 'ID' 列来解决这个问题。

我在 sqlite VIEW 网页上做了一个快速的 ^F 'rowid' 并没有找到对 rowid 的引用。快速 google 给出了很多关于 NO ROWID 的匹配项,所以我没有找到答案。

我想知道我是否误用了视图。基本上,该视图是我将 link 与多个相关 table 一起呈现的单个 table 的一种方式。但是我需要通过 'rowid' 访问视图。为了避免讨论为什么使用 rowid 而不是 ID 列,原因是我的 table 是一次写入(通过数据提取器)然后是只读的。数据提取器知道它输入的内容和位置,然后知道 rowid,然后避免创建冗余列。

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

要识别视图中使用的 table 中的行,您只需在视图中包含 table 中的 rowid 值:

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

无论如何,声明为 INTEGER PRIMARY KEY 的列是 rowid 的别名(因此不需要额外存储)。 如果您真的想使用 rowid 值,最好在 table 定义中明确包含这样一个列:

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

(它的行为仍然与 rowid 相同;您可以通过向其中插入 NULL 值来获得 autoincremented values。)