2015-10-02 66 views
1

我試圖使用RTREE,面對這個陌生的beheaviour:INSERT語句與一個普通表工作正常的RTREE表失敗:sqlite的RTREE:約束失敗(與常規表的工作原理)

這個例子正常工作:

DROP TABLE IF EXISTS ltssoffsets; 
CREATE TABLE ltssoffsets(id TEXT NOT NULL, 
    offset_start INT NOT NULL, 
    gene_start INT NOT NULL, 
    chr TEXT NOT NULL, start INT, end INT, 
    PRIMARY KEY (id, offset_start)); 

INSERT INTO ltssoffsets VALUES("first", -10, 45, "chr2", 30, 40); 
INSERT INTO ltssoffsets VALUES("first", -5, 45, "chr2", 30, 40); 

這一次失敗:

DROP TABLE IF EXISTS ltssoffsets; 
CREATE VIRTUAL TABLE ltssoffsets USING rtree(id TEXT NOT NULL, 
    offset_start INT NOT NULL, 
    gene_start INT NOT NULL, 
    chr TEXT NOT NULL, start INT, end INT, 
    PRIMARY KEY (id, offset_start)); 

INSERT INTO ltssoffsets VALUES("first", -10, 45, "chr2", 30, 40); 
INSERT INTO ltssoffsets VALUES("first", -5, 45, "chr2", 30, 40); 

-> Error: constraint failed 

什麼可以錯在這裏?

回答

1

虛擬表的行爲不像常規表。 如何處理列類型和約束取決於虛擬表的實現。

R-tree documentation說:

一個SQLite R *樹的第一列必須總是整數主鍵。最小/最大值對列存儲爲32位的浮點值[...]

你的R樹表簡單地具有整數主鍵列id,和四個座標列。您所有的類型和約束都會被忽略。

R樹應該被用作索引,而不是表格。

R * Tree索引存儲的關於對象的唯一信息是其整數ID及其邊界框。其他信息需要存儲在不同的表中,並使用主鍵與R *樹索引相關。

+0

沒錯。這絕對是一種非預期的用法,但錯誤是令人困惑的,因爲它不會彈出表格初始化,而是插入到表格中 –