程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php SQLite學習筆記與常見問題分析第1/2頁

php SQLite學習筆記與常見問題分析第1/2頁

編輯:關於PHP編程

直到學會! 學之前找資料
SQLite的sql
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE


sqlite常見問題
 (1) 如何建立自動增長字段?

簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會自動增長。

長一點的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那麼, 每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數,如果表是空的, 將會是1。 (如果是最大可能的主鍵 9223372036854775807,那個,將鍵值將是隨機未使用的數。) 如,有下列表:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

在該表上,下列語句

INSERT INTO t1 VALUES(NULL,123);

在邏輯上等價於:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

有一個新的API叫做 sqlite3_last_insert_rowid(), 它將返回最近插入的整數值。

注意該整數會比表中該列上的插入之前的最大值大1。該鍵值在當前的表中是唯一的。但有可能與已從表中刪除的值重疊。要想建立在整個表的生命周期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT聲明。那麼,新的鍵值將會比該表中曾能存在過的最大值大1。如果最大可能的整數值在數據表中曾經存在過,INSERT將會失敗, 並返回SQLITE_FULL錯誤代碼。


--------------------------------------------------------------------------------

(2)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  包含了 年、月、日、時、分、秒、千分之一秒。

參見 http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------

(3)SQLite允許向一個integer型字段中插入字符串!

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

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


--------------------------------------------------------------------------------

(4)為什麼SQLite不允許在同一個表不同的兩行上使用0和0.0作主鍵?

主鍵必須是數值類型,將主鍵改為TEXT型將不起作用。

每一行必須有一個唯一的主鍵。對於一個數值型列, SQLite認為 '0' 和 '0.0' 是相同的, 因為他們在作為整數比較時是相等的(參見上一問題)。 所以,這樣值就不唯一了。


--------------------------------------------------------------------------------

(5)多個應用程序或一個應用程序的多個實例可以同時訪問同一個數據庫文件嗎?

多個進程可同時打開同一個數據庫。多個進程可以同時進行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 函數調整這一行為。
---------------------------------------------------------------------------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved