2012-03-26 3 views
2

im (in Qt)mit SQLite virtueller Tabelle erstellen mit einzigartigen Spalt FTS3 dosnot einzigartig bleiben

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

dann ausführen

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

im mit voller Volltextsuche so ist dieser Weg in Schaffung VIRTUELLE TABELLE verwenden

Wenn ich eine andere Zeile mit user_id == 123 habe, fügt sie immer noch die Zeile ein, warum?

Antwort

3

Die Dokumentation FTS states dass:

Gleiches gilt für die möglichen Einschränkungen gilt zusammen mit einem FTS Spaltennamen angegeben - sie analysiert werden, aber nicht durch das System in irgendeiner Form verwendet oder aufgezeichnet.

Also die UNIQUE Einschränkung wird ignoriert.

Sie die Einschränkung auf eine Ansicht unter Verwendung eines Trigger emulieren kann (nicht auf dem Tisch, weil Trigger auf virtuelle Tabellen nicht verfügbar sind), und dann, indem Sie auf dieser Ansicht die Zeile eingefügt:

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 ...; 

Da OR IGNORE eine explizite RAISE nicht ignoriert, müssen Sie RAISE(ABORT,...) durch RAISE(IGNORE) ersetzen, wenn Sie den Fehler ignorieren möchten.

+0

Ich verwende Volltextsuche in der Tabelle, alle Felder sind Texttyp – user63898

+0

@ user63898 Dann duplizieren Sie die Benutzer_id in einer regulären Tabelle, und überprüfen Sie, ob die ID existiert vor dem Einfügen in die FTS-Tabelle (Sie können dies automatisieren mit einem Transaktion oder ein Trigger). – alexisdm

+0

können Sie zeigen, mit Beispiel zu verbinden bitte – user63898

Verwandte Themen