解析SQLite中的常見問題與總結詳解

來源:互聯網
上載者:User

1、 建立資料
如果不往資料庫裡面添加任何的表,這個資料庫等於沒有建立,不會在硬碟上產生任何檔案,如果資料庫已經存在,則會開啟這個資料庫。

2、 如何通過sqlite3.dll與sqlite3.def產生sqlite3.lib檔案
LIB /DEF:sqlite3.def /machine:IX86

3、 sqlite3_open開啟一個資料庫時,如果資料庫不存在就會新產生一個資料庫檔案。如果接著執行其他查詢語句就會失敗,比如sqlite3_prepare,編程中出現明明指定了資料庫而且裡面也有資料,為什麼查詢失敗了,主要是資料庫名路徑不對引起的。一般的做法是先檢查資料庫檔案是否存在,如果存在就使用sqlite3_open開啟資料庫;否則建立一個新的資料庫。

4、 如何建立自動成長欄位
聲明為INTEGER PRIMARY KEY的列將會自動成長。

5、SQLite3支援何種資料類型?
NULL
INTEGER
REAL
TEXT
BLOB
但實際上,sqlite3也接受如下的資料類型:
smallint 16位元的整數。
interger 32位元的整數。
decimal(p,s) p精確值和s大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位元。如果沒有特別指定,則系統會設為p=5; s=0。
float 32位元的實數。
double 64位元的實數。
char(n) n長度的字串,n不能超過254。
varchar(n)長度不固定且其最大長度為n的字串,n不能超過4000。
graphic(n)和char(n)一樣,不過其單位是兩個字元double-bytes,n不能超過127。這個形態是為了支援兩個字元長度的字型,例如中文字。
vargraphic(n)可變長度且其最大長度為n的雙字元字串,n不能超過2000。
date包含了年份、月份、日期。
time包含了小時、分鐘、秒。
timestamp包含了年、月、日、時、分、秒、千分之一秒。

6、SQLite允許向一個integer型欄位中插入字串
這是一個特性,而不是一個bug。SQLite不強制資料類型約束。任何資料都可以插入任何列。你可以向一個整型列中插入任意長度的字串,向布爾型列中插入浮點數,或者向字元型列中插入日期型值。在CREATE TABLE中所指定的資料類型不會限制在該列中插入任何資料。任何列均可接受任意長度的字串(只有一種情況除外:標誌為INTEGER PRIMARY KEY的列只能儲存64位整數,當向這種列中插資料除整數以外的資料時,將會產生錯誤。

但SQLite確實使用聲明的列類型來指示你所期望的格式。所以,例如你向一個整型列中插入字串時,SQLite會試圖將該字串轉換成一個整數。如果可以轉換,它將插入該整數;否則,將插入字串。這種特性有時被稱為類型或列親和性(type or column affinity).

7、為什麼SQLite不允許在同一個表不同的兩行上使用0和0.0作主鍵?
主鍵必須是數實值型別,將主鍵改為TEXT型將不起作用。
每一行必須有一個唯一的主鍵。對於一個數值型列,SQLite認為'0'和'0.0'是相同的,因為他們在作為整數比較時是相等的(參見上一問題)。所以,這樣值就不唯一了。

8、多個應用程式或一個應用程式的多個執行個體可以同時訪問同一個資料庫檔案嗎?

多個進程可同時開啟同一個資料庫。多個進程可以同時進行SELECT操作,但在任一時刻,只能有一個進程對資料庫變更。

SQLite使用讀、寫鎖控制對資料庫的訪問。(在Win95/98/ME等不支援讀、寫鎖的系統下,使用一個機率性的類比來代替。)但使用時要注意:如果資料庫檔案存放於一個NFS檔案系統上,這種鎖機制可能不能正常工作。這是因為fcntl()檔案鎖在很多NFS上沒有正確的實現。在可能有多個進程同時訪問資料庫的時候,應該避免將資料庫檔案放到NFS上。在Windows上,Microsoft的文檔中說:如果使用FAT檔案系統而沒有運行share.exe守護進程,那麼鎖可能是不能正常使用的。那些在Windows上有很多經驗的人告訴我:對於網路檔案,檔案鎖的實現有好多Bug,是靠不住的。如果他們說的是對的,那麼在兩台或多台Windows機器間共用資料庫可能會引起不期望的問題。

我們意識到,沒有其它嵌入式的SQL資料庫引擎能象SQLite這樣處理如此多的並發。SQLite允許多個進程同時開啟一個資料庫,同時讀一個資料庫。當有任何進程想要寫時,它必須在更新過程中鎖住資料庫檔案。但那通常只是幾毫秒的時間。其它進程只需等待寫進程幹完活結束。典型地,其它嵌入式的SQL資料庫引擎同時只允許一個進程串連到資料庫。

但是,Client/Server資料庫引擎(如PostgreSQL, MySQL,或Oracle)通常支援更進階別的並發,並且允許多個進程同時寫同一個資料庫。這種機制在Client/Server結構的資料庫上是可能的,因為總是有一個單一的伺服器處理序很好地控制、協調對資料庫的訪問。如果你的應用程式需要很多的並發,那麼你應該考慮使用一個Client/Server結構的資料庫。但經驗表明,很多應用程式需要的並發,往往比其設計者所想象的少得多。

當SQLite試圖訪問一個被其它進程鎖住的檔案時,預設的行為是返回SQLITE_BUSY。可以在C代碼中使用sqlite3_busy_handler()或sqlite3_busy_timeout() API函數調整這一行為。

9、SQLite安全執行緒嗎?
線程是魔鬼(Threads are evil)。避免使用它們。
SQLite是安全執行緒的。由於很多使用者會忽略我們在上一段中給出的建議,我們做出了這種讓步。但是,為了達到安全執行緒,SQLite在編譯時間必須將SQLITE_THREADSAFE預先處理宏置為1。在Windows和Linux上,已編譯的好的二進位發行版中都是這樣設定的。如果不確定你所使用的庫是否是安全執行緒的,可以調用sqlite3_threadsafe()介面找出。

10、在SQLite資料庫中如何列出所有的表和索引?
如果你運行sqlite3命令列來訪問你的資料庫,可以鍵入“.tables”來獲得所有表的列表。或者,你可以輸入“.schema”來看整個資料庫模式,包括所有的表的索引。輸入這些命令,後面跟一個LIKE模式比對可以限制顯示的表。

11、SQLite資料庫有已知的大小限制嗎?
在Windows和Unix下,版本2.7.4的SQLite可以達到2的41次方位元組(2T位元組)。老版本的為2的31次方位元組(2G位元組)。
SQLite版本2.8限制一個記錄的容量為1M。SQLite版本3.0則對單個記錄容量沒有限制。
表名、索引表名、視圖名、觸發器名和欄位名沒有長度限制。但SQL函數的名稱(由sqlite3_create_function() API函數建立)不得超過255個字元。

12、在SQLite中,VARCHAR欄位最長是多少?
SQLite不強制VARCHAR的長度。你可以在SQLITE中聲明一個VARCHAR(10),SQLite還是可以很高興地允許你放入500個字元。並且這500個字元是原封不動的,它永遠不會被截斷。

13、在SQLite中,如何在一個表上添加或刪除一列?
SQLite有有限地ALTER TABLE支援。你可以使用它來在表的末尾增加一列,可更改表的名稱。如果需要對錶結構做更複雜的改變,則必須重建立表。重建時可以先將已存在的資料放到一個暫存資料表中,刪除原表,建立新表,然後將資料從暫存資料表中複製回來。

如,假設有一個t1表,其中有"a", "b", "c"三列,如果要刪除列c,以下流程說明如何做:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
14、在SQLite中支援分頁嗎?

SQLite分頁是世界上最簡單的。如果我要去11-20的Account表的資料Select * From Account Limit 9 Offset 10;
以上語句表示從Account表擷取資料,跳過10行,取9行。這個特性足夠讓很多的web中型網站使用這個了。也可以這樣寫 select * from account limit10,9和上面的的效果一樣。這種寫法MySQL也支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.