SQLite FAQ常見問題解答
本文主要介紹一些關(guān)于SQLite FAQ 的一些常見的問題,接下來我們就開始一一介紹:
1.如何定義自增主鍵
定義為 INTEGER PRIMARY KEY 的列會被設(shè)為從1開始自增,哪怕在使用時插入NULL值也會被自動替換。
sqlite3_last_insert_rowid()函數(shù)可以返回***插入的行的rowid(注意多線程場合)。
注意,自增主鍵會重新使用被刪除的行的主鍵。要避免這種情況,可以使用 INTEGER PRIMARY KEY AUTOINCREMENT 定義。
2.支持類型
動態(tài)類型,可以是 INTEGER, REAL, TEXT, BLOB, NULL
3.在INTEGER 列中插入字符串??!
由于(該死的)動態(tài)類型,這樣做是合法的,但是SQLite會嘗試進(jìn)行轉(zhuǎn)換,如果這個字符串可以轉(zhuǎn)換為INTEGER,則以INTEGER形式存儲。該特性被稱為 Type Affinity
4.同一個數(shù)據(jù)庫文件可以被不同的程序同時訪問嗎?
可以同時讀取,但只有一個可以寫入。
在NFS文件系統(tǒng)上可能發(fā)生異常。
5.是否線程安全?
理論上是??梢杂?sqlite3_threadsafe() 函數(shù)進(jìn)行判斷。
避免線程!
6.列舉所有的表/索引
命令行: .tables 列舉所有表;.schema 列舉所有表和索引
SQL: SELECT name FROM sqlite_master WHERE type IN ('table', 'index')
7.容量限制
string/BLOB: 1,000,000,000
***列數(shù)量:2000 (誰要真的用到成千上百的列,直接跳樓算了)
SQL語句***長度:1,000,000 (如需插入超過此長度的列數(shù)據(jù),需要使用Parameters )
最多可以Join的表:64
最多可附加的數(shù)據(jù)庫:10 (把多個數(shù)據(jù)庫附加到同一個數(shù)據(jù)庫連接)
***行數(shù):1.8E19
8.如何向現(xiàn)有的表添加列
ALTER TABLE僅支持重命名表或在表的末尾添加列。復(fù)雜操作必須通過臨時表進(jìn)行置換。
9.ROUND(9.95, 1)為什么不等于10
對于浮點數(shù)來說無法精確表示9.95,SQLite認(rèn)為其值為9.9499999。
10.大小寫敏感
僅對ASCII字符有效,對Unicode字符都是敏感的。
11.INSERT很慢
SQLite可以輕松達(dá)到50k以上的插入速度。但是transactions速度僅為每秒60次左右(7200rpm)。
使用 BEGIN/COMMIT 包圍INSERT語句可以使其成為單一事務(wù)。
或者可以使用PRAGMA synchronous=OFF 讓SQLite在寫入磁盤前就繼續(xù)執(zhí)行。但如果遭遇斷電等情況就會發(fā)生數(shù)據(jù)丟失。
12.SQLite的UNIQUE解讀
同Oracle/MySQL/PostgreSQL一樣,是不能為NULL的(另一種解讀如SQLServer則是在非NULL子集中判斷是否有重復(fù))。
【編輯推薦】
- 嵌入式數(shù)據(jù)庫Sqlce讀取數(shù)據(jù)過程簡介
- 如何不使用數(shù)據(jù)庫緩存,還達(dá)到實時更新
- 微軟WP7本地數(shù)據(jù)庫之SQLite編程技巧
- 微軟WP7本地數(shù)據(jù)庫之Sterling編程技巧