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。)
我发现视图没有 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。)