最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php SQLite學(xué)習(xí)筆記與常見(jiàn)問(wèn)題分析第1/2頁(yè)

 更新時(shí)間:2008年07月23日 19:22:44   作者:  
php SQLite學(xué)習(xí)資料收集,與一些常見(jiàn)問(wèn)題的解決方法
直到學(xué)會(huì)! 學(xué)之前找資料
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常見(jiàn)問(wèn)題
 (1) 如何建立自動(dòng)增長(zhǎng)字段?

簡(jiǎn)短回答:聲明為 INTEGER PRIMARY KEY 的列將會(huì)自動(dòng)增長(zhǎng)。

長(zhǎng)一點(diǎn)的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那么, 每當(dāng)你在該列上插入一NULL值時(shí), NULL自動(dòng)被轉(zhuǎn)換為一個(gè)比該列中最大值大1的一個(gè)整數(shù),如果表是空的, 將會(huì)是1。 (如果是最大可能的主鍵 9223372036854775807,那個(gè),將鍵值將是隨機(jī)未使用的數(shù)。) 如,有下列表:

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

在該表上,下列語(yǔ)句

INSERT INTO t1 VALUES(NULL,123);

在邏輯上等價(jià)于:

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

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

注意該整數(shù)會(huì)比表中該列上的插入之前的最大值大1。該鍵值在當(dāng)前的表中是唯一的。但有可能與已從表中刪除的值重疊。要想建立在整個(gè)表的生命周期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT聲明。那么,新的鍵值將會(huì)比該表中曾能存在過(guò)的最大值大1。如果最大可能的整數(shù)值在數(shù)據(jù)表中曾經(jīng)存在過(guò),INSERT將會(huì)失敗, 并返回SQLITE_FULL錯(cuò)誤代碼。


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

(2)SQLite3支持何種數(shù)據(jù)類型?

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

參見(jiàn) http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------

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

這是一個(gè)特性,而不是一個(gè)bug。SQLite不強(qiáng)制數(shù)據(jù)類型約束。任何數(shù)據(jù)都可以插入任何列。你可以向一個(gè)整型列中插入任意長(zhǎng)度的字符串,向布爾型列中插入浮點(diǎn)數(shù),或者向字符型列中插入日期型值。 在 CREATE TABLE 中所指定的數(shù)據(jù)類型不會(huì)限制在該列中插入任何數(shù)據(jù)。任何列均可接受任意長(zhǎng)度的字符串(只有一種情況除外: 標(biāo)志為INTEGER PRIMARY KEY的列只能存儲(chǔ)64位整數(shù),當(dāng)向這種列中插數(shù)據(jù)除整數(shù)以外的數(shù)據(jù)時(shí),將會(huì)產(chǎn)生錯(cuò)誤。

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


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

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

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

每一行必須有一個(gè)唯一的主鍵。對(duì)于一個(gè)數(shù)值型列, SQLite認(rèn)為 '0' 和 '0.0' 是相同的, 因?yàn)樗麄冊(cè)谧鳛檎麛?shù)比較時(shí)是相等的(參見(jiàn)上一問(wèn)題)。 所以,這樣值就不唯一了。


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

(5)多個(gè)應(yīng)用程序或一個(gè)應(yīng)用程序的多個(gè)實(shí)例可以同時(shí)訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)文件嗎?

多個(gè)進(jìn)程可同時(shí)打開同一個(gè)數(shù)據(jù)庫(kù)。多個(gè)進(jìn)程可以同時(shí)進(jìn)行SELECT 操作,但在任一時(shí)刻,只能有一個(gè)進(jìn)程對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改。

SQLite 使用讀、寫鎖控制對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。(在Win95/98/ME等不支持讀、寫鎖的系統(tǒng)下,使用一個(gè)概率性的模擬來(lái)代替。)但使用時(shí)要注意:如果數(shù)據(jù)庫(kù)文件存放于一個(gè)NFS文件系統(tǒng)上,這種鎖機(jī)制可能不能正常工作。 這是因?yàn)?nbsp;fcntl() 文件鎖在很多NFS上沒(méi)有正確的實(shí)現(xiàn)。在可能有多個(gè)進(jìn)程同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,應(yīng)該避免將數(shù)據(jù)庫(kù)文件放到NFS上。在Windows上,Microsoft的文檔中說(shuō):如果使用 FAT 文件系統(tǒng)而沒(méi)有運(yùn)行 share.exe 守護(hù)進(jìn)程,那么鎖可能是不能正常使用的。那些在Windows上有很多經(jīng)驗(yàn)的人告訴我:對(duì)于網(wǎng)絡(luò)文件,文件鎖的實(shí)現(xiàn)有好多Bug,是靠不住的。如果他們說(shuō)的是對(duì)的,那么在兩臺(tái)或多臺(tái)Windows機(jī)器間共享數(shù)據(jù)庫(kù)可能會(huì)引起不期望的問(wèn)題。

我們意識(shí)到,沒(méi)有其它嵌入式的 SQL 數(shù)據(jù)庫(kù)引擎能象 SQLite 這樣處理如此多的并發(fā)。SQLite允許多個(gè)進(jìn)程同時(shí)打開一個(gè)數(shù)據(jù)庫(kù),同時(shí)讀一個(gè)數(shù)據(jù)庫(kù)。當(dāng)有任何進(jìn)程想要寫時(shí),它必須在更新過(guò)程中鎖住數(shù)據(jù)庫(kù)文件。但那通常只是幾毫秒的時(shí)間。其它進(jìn)程只需等待寫進(jìn)程干完活結(jié)束。典型地,其它嵌入式的SQL數(shù)據(jù)庫(kù)引擎同時(shí)只允許一個(gè)進(jìn)程連接到數(shù)據(jù)庫(kù)。

但是,Client/Server數(shù)據(jù)庫(kù)引擎(如 PostgreSQL, MySQL, 或 Oracle)通常支持更高級(jí)別的并發(fā),并且允許多個(gè)進(jìn)程同時(shí)寫同一個(gè)數(shù)據(jù)庫(kù)。這種機(jī)制在Client/Server結(jié)構(gòu)的數(shù)據(jù)庫(kù)上是可能的,因?yàn)榭偸怯幸粋€(gè)單一的服務(wù)器進(jìn)程很好地控制、協(xié)調(diào)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。如果你的應(yīng)用程序需要很多的并發(fā),那么你應(yīng)該考慮使用一個(gè)Client/Server 結(jié)構(gòu)的數(shù)據(jù)庫(kù)。但經(jīng)驗(yàn)表明,很多應(yīng)用程序需要的并發(fā),往往比其設(shè)計(jì)者所想象的少得多。

當(dāng)SQLite試圖訪問(wèn)一個(gè)被其它進(jìn)程鎖住的文件時(shí),缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數(shù)調(diào)整這一行為。
---------------------------------------------------------------------------

相關(guān)文章

最新評(píng)論

泰和县| 大厂| 镇江市| 内丘县| 门源| 遂平县| 成安县| 榕江县| 温泉县| 独山县| 扎囊县| 鄯善县| 潮安县| 仙游县| 龙岩市| 黄山市| 永新县| 额敏县| 盐山县| 古田县| 田林县| 吐鲁番市| 额敏县| 左云县| 武平县| 墨竹工卡县| 宁陕县| 屯门区| 丰原市| 射阳县| 防城港市| 沁水县| 杨浦区| 当涂县| 利辛县| 洞头县| 秦皇岛市| 大洼县| 垣曲县| 木里| 宜川县|