Tôi muốn sử dụng SQLite FTS3 (FTS4, trên thực tế) để chỉ một bảng với các cột số nguyên, khái niệm một cái gì đó như thế này:Sử dụng SQLite FTS3 với các cột INTEGER
CREATE VIRTUAL TABLE whole (document INTEGER, page INTEGER, content TEXT,
UNIQUE(document, page)) USING fts4();
Tôi biết rằng FTS3 đối xử với tất cả các cột khác hơn rowid như TEXT, vì vậy tôi sẽ phải sử dụng hai bảng:
CREATE VIRTUAL TABLE data USING fts4();
CREATE TABLE metadata(document INTEGER, page INTEGER, UNIQUE(document, page));
tôi muốn để có thể truy vấn cho các tài liệu, hoặc cho các trang trong một tài liệu đưa ra:
SELECT DISTINCT document FROM metadata NATURAL JOIN data WHERE content MATCH 'foo';
SELECT page FROM metadata NATURAL JOIN data
WHERE document = 123 AND content MATCH 'foo';
Tôi nghĩ NATURAL JOIN yêu cầu tôi đảm bảo rằng các hàng được giữ đồng bộ, nhưng cách tốt nhất để làm điều đó là gì? Tôi có nên sử dụng khóa NGOẠI HỐI hay ràng buộc khác không? Một sub-select có thể tốt hơn là join?
Tôi muốn chèn một tài liệu và trang đã có trong cơ sở dữ liệu để ghi đè nội dung văn bản. Là có thể lập trình thông qua SQL hoặc tôi sẽ phải kiểm tra xem hàng đã tồn tại trong bảng thông tin?
Tôi cũng sẽ muốn XOÁ TỪ cả hai bảng cho một tài liệu nhất định - có cách nào để thực hiện điều này trong một câu lệnh không?
Tất cả lời khuyên đã được biết ơn, nhưng vì tôi là người mới sử dụng SQL, các mẫu mã đặc biệt được đánh giá cao!
Cập nhật: Hoàn toàn không rõ ràng cách tôi có thể tạo ràng buộc khóa ngoại tại đây. Nếu tôi chọn metadata
như bảng cha (đó sẽ là sở thích của tôi, trong sự vắng mặt của một hạn chế hai chiều):
PRAGMA foreign_keys = ON;
CREATE TABLE metadata (document INTEGER, page INTEGER);
CREATE VIRTUAL TABLE data USING fts4(content TEXT, docid REFERENCES metadata);
tôi nhận được Error: vtable constructor failed: data
(gì ngạc nhiên, bởi vì docid
là một bí danh cho rowid
, nhưng dĩ nhiên tôi có thể không sử dụng cột khác vì tất cả các cột ngoại trừ rowid
phải là TEXT
).
Trong khi đó nếu tôi cố gắng theo chiều ngược lại:
PRAGMA foreign_keys = ON;
CREATE VIRTUAL TABLE data USING fts4();
CREATE TABLE metadata (document INTEGER, page INTEGER, docid REFERENCES data);
việc xây dựng bảng thành công, nhưng nếu tôi cố gắng:
INSERT INTO data (docid, content) VALUES (123, 'testing');
INSERT INTO metadata (docid, document, page) VALUES (123, 12, 23);
tôi nhận được Error: foreign key mismatch
.
bạn có quản lý tạo các bảng ảo bằng các khóa ngoại không? – Maragues
@Maragues Không, và bạn cũng không thể thực thi các ràng buộc giống nhau - xem câu trả lời của tôi bên dưới. Các bảng ảo AFAICT thực sự chỉ là các chương trình với các giao diện SQL. – hatfinch