2012-03-26 30 views
2

IM(Qt中)使用SQLite創建虛擬表使用FTS3具有獨特柱dosnot留下獨特

QString q = "CREATE VIRTUAL TABLE playlist USING fts3 (" 
         "from_user , " 
         "from_id , " 
         "created_time , " 
         "created_time_formated , " 
         "user_id unique)"; 

創建然後使用全全文搜索,所以這是方式即時執行

"INSERT OR IGNORE INTO play_list (from_user,from_id,created_time,created_time_formated,user_id) SELECT '....','....','.....','....','123'" 

IM使用虛擬表

如果我有另一行user_id == 123它仍然會插入行,爲什麼?

回答

3

的FTS文件states是:

這同樣適用於與FTS列名一起指定任何約束 - 他們被解析,但不以任何方式使用或記錄由系統。

因此UNIQUE約束被忽略。

您可以通過使用視圖上觸發通過該視圖插入行模擬約束(上不了檯面的,因爲觸發不可用虛擬表),然後輸入:

CREATE VIEW playlist_view AS SELECT * FROM playlist; 

CREATE TRIGGER insert_playlist INSTEAD OF INSERT ON playlist_view 
BEGIN 
    SELECT RAISE(ABORT, 'column user_id is not unique') FROM playlist 
     WHERE user_id=new.user_id; 
    INSERT INTO playlist (from_user, from_id, created_time, 
          created_time_formated, user_id) 
    VALUES (NEW.from_user, NEW.from_id, NEW.created_time, 
      NEW.created_time_formated, NEW.user_id); 
END; 

-- And you do the insertion on the view 
INSERT INTO playlist_view (from_user,from_id,created_time,created_time_formated,user_id) SELECT ...; 

因爲OR IGNORE不會忽略明確的RAISE,所以如果您要忽略該錯誤,則必須用RAISE(IGNORE)代替RAISE(ABORT,...)

+0

我確實在表格中使用了全文搜索,所有字段都是文本類型 – user63898 2012-03-27 04:53:01

+0

@ user63898然後在常規表格中複製user_id,並在插入FTS表之前檢查該ID是否存在(您可以使用交易或觸發器)。 – alexisdm 2012-03-27 14:24:21

+0

您能否指點鏈接示例請 – user63898 2012-03-28 06:55:38