2016-07-22 128 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