開(kāi)發(fā)轉(zhuǎn)載sqlite權(quán)威指南安卓_第1頁(yè)
開(kāi)發(fā)轉(zhuǎn)載sqlite權(quán)威指南安卓_第2頁(yè)
開(kāi)發(fā)轉(zhuǎn)載sqlite權(quán)威指南安卓_第3頁(yè)
開(kāi)發(fā)轉(zhuǎn)載sqlite權(quán)威指南安卓_第4頁(yè)
開(kāi)發(fā)轉(zhuǎn)載sqlite權(quán)威指南安卓_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余119頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

推薦者的話學(xué)習(xí)時(shí)基本找不到既好又系統(tǒng)的中文文章,也買(mǎi)不到好的中文書(shū)籍,看來(lái)在國(guó)內(nèi)還 在不得不看英文資料時(shí)總喜歡一邊看一邊翻,主要是怕下次再看時(shí)還是看不懂??础禩heDefinitiveGuideto》時(shí)這個(gè)毛病也沒(méi)改,當(dāng)然了,看的時(shí)候就是挑著看的,翻的也只是一小部分了。是沒(méi)有的,但這本書(shū)卻是受保護(hù)的,也不知我這樣做是否合法。發(fā)到網(wǎng)上也只是想做一個(gè)好事,響應(yīng)的共享精神。估計(jì)不會(huì)有人來(lái)告我吧,反正我沒(méi)錢(qián)。另和《TheDefinitiveGuideto》一書(shū)的一個(gè)推薦吧,同樣對(duì)感但又看不懂我的中文的兄弟,強(qiáng)烈建議看原文。感謝RichardHipp編出這么好的程序,感謝MichaelOwens寫(xiě)出這么好的書(shū)。本文對(duì)您能有一點(diǎn)點(diǎn)幫助,也算是我對(duì)做了一點(diǎn)貢獻(xiàn)吧。本文中帶有“空注”的內(nèi)接觸時(shí)間不長(zhǎng),所以本文難免會(huì)有很多錯(cuò)誤,不是故意誤導(dǎo)大家,是真的水平低。 Theauthordi scopyrighttothissourcecode. Inceofalegalnotice,hereisablessing:Mayyoudogoodandnotevil.Mayyoufindforgivenessforyourselfandforgiveothers.Mayyousharely,nevertakingmorethanyougive.Ver1.00:2009-11-07總第1章介2章34章5第6章C7章擴(kuò)充C8第9章內(nèi)指 前 第1章介 的歷史 誰(shuí)使用 接口 的特色 零配 兼容 緊湊 簡(jiǎn) 適應(yīng) 可靠 易用 第2章從哪得到 獲得的動(dòng)態(tài)庫(kù) 在Windows環(huán)境下編譯源代 用VisualC++構(gòu)建 用VisualC++構(gòu)建 使用數(shù)據(jù) S模式下使用 其它工 第3章關(guān)系模 第4章 SQL的發(fā) 建 語(yǔ) 命 常 注 創(chuàng)建 改變 過(guò) 事 解 死 視 索 觸發(fā) 系統(tǒng) 查看Query的執(zhí) 第5章設(shè)計(jì)和概 版本3的新特性 API 擴(kuò)充 事 讀事 寫(xiě)事 編 表 第6章C 執(zhí)行 取記 提交Hook函 回卷Hook函 修改Hook函 函 線 第7章擴(kuò)充C 函 返回 函 返回 聚 排序 第8章語(yǔ)言擴(kuò) 第9章內(nèi) 棧 程序 B-Tree和Pager模 編譯 代碼(Code 優(yōu) 前天,有成百萬(wàn)的拷貝在默默地運(yùn)行,在計(jì)算機(jī)中,或在不同公司生產(chǎn)的各種各樣的小設(shè)備中。你可能已經(jīng)在無(wú)意識(shí)的情況下使用過(guò),在你的、MP3或機(jī)頂盒里可能就有。在你的計(jì)算機(jī)里也可能至少會(huì)有一個(gè)的拷貝,它可能來(lái)自Apple的MacOSX,或者在大多數(shù)的Linux版本中,或者在Windows中安裝某個(gè)第軟件時(shí)。很多Web的都使用,這要感謝它已經(jīng)被包含為PHP5語(yǔ)言的一部分。 統(tǒng)等。因?yàn)闆](méi)有使用的全面報(bào)告,所以,肯定還有很多我不知道的部署。的普及很大程度上應(yīng)該歸功于MichaelOwens。Mike在TheLinuxJournal(June2003)和TheC/C++UsersJournal(March2004)上的文章吸引了無(wú)數(shù)程序員。每篇文章后,的量都會(huì)顯著上升。通過(guò)這本書(shū)你可以看到Mike的才華和他所做的大量工作,相信你不會(huì)失望。本書(shū)包含了關(guān)于所需要了解的所有內(nèi)容,你應(yīng)該一直把它放不屬于任何人,也不在的保護(hù)范圍之內(nèi)。所有曾經(jīng)為項(xiàng)目貢獻(xiàn)過(guò)代碼的險(xiǎn)箱里。我還盡力保證在中不使用專(zhuān)利算法,這些預(yù)防措施意味著你可以以任何形式使用,而不需要付版稅、證費(fèi)用或受到其它任何限制?!匀辉诎l(fā)展。但我和其他開(kāi)發(fā)者都堅(jiān)守它的價(jià)值。保持代碼的小規(guī)模—庫(kù)不會(huì)超過(guò)250KB。保持公共API和文件格式的向上兼容性。繼續(xù)—調(diào)試。2004年,從版本2升級(jí)到版本3時(shí)確實(shí)沒(méi)能保持向上兼容性,但從那以后,我們已經(jīng)能夠達(dá)到上述所有目標(biāo)并準(zhǔn)備在將來(lái)繼續(xù)這樣做。沒(méi)有版本4的計(jì)希望你覺(jué)著是有用的,我代表的所有貢獻(xiàn)者保證,使用你會(huì):免費(fèi)地得到了,也請(qǐng)你免費(fèi)地給予他人一些東西作為回報(bào)。做一回,貢獻(xiàn)出RichardHippCharlotte,NCApril11,2006第1章介內(nèi)嵌式數(shù)據(jù)庫(kù)如圖1-1所示。一個(gè)Perl、一個(gè)標(biāo)準(zhǔn)C/C++程序和一個(gè)使用PHP編寫(xiě)的Apache進(jìn)程都使用。Perl導(dǎo)入DBI:: 模板,并通過(guò)它來(lái)CAPI。PHP采用與C相似的方式CAPI??傊?,它們都需要CAPI。盡管它們每個(gè)進(jìn)程中都有獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器,但它們可以操作相同的數(shù)據(jù)庫(kù)文件。利用操作系統(tǒng)功能來(lái)完成數(shù)據(jù)的同步1-1內(nèi)嵌的主進(jìn)程中的目前市場(chǎng)上有多種為內(nèi)嵌應(yīng)用所設(shè)計(jì)的關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品,如SybaseSQLAnywhere、InterSystemsCaché、PervasivePSQL和微軟的JetEngine。有些廠家從他們的大型數(shù)據(jù)庫(kù)產(chǎn)品翻新出內(nèi)嵌式的變種,如IBM的DB2Everyce、Oracle的10g和微軟的SQLServer僅有兩個(gè)是完全開(kāi)放源代碼的且不收證費(fèi)用——Firebird和。在這兩個(gè)當(dāng)中,僅開(kāi)發(fā)者的數(shù)據(jù)庫(kù)具有多方面的特性。它是一個(gè)數(shù)據(jù)庫(kù),一個(gè)程序庫(kù),一個(gè)命令行工具,也是一個(gè)學(xué)服務(wù)、語(yǔ)言和應(yīng)用程序。對(duì)于程序員來(lái)說(shuō),就象一個(gè)數(shù)據(jù)傳送帶,提供了一種方便的將應(yīng)用程序綁定的數(shù)據(jù)的方法。就象傳送帶一樣,對(duì)的使用沒(méi)有終點(diǎn)。除了僅僅作為一個(gè)容器,還可以作為一個(gè)單純的數(shù)據(jù)處理的工具。如果大小和復(fù)雜性合適,使用可以很容易地將應(yīng)用程序所使用的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為表,并保存在完成下面SQL語(yǔ)句所代表的工作需要多少代碼:SELECTAVG(z-y)FROMtableGROUPBYxHAVINGx>MIN(z)ORx<MAX(y)ORDERBYyDESCLIMIT10OFFSET3;還是一個(gè)很好的學(xué)習(xí)程序設(shè)計(jì)的工具,通過(guò)它可以研究很多計(jì)算機(jī)科學(xué)的課題。分析器、分詞器、虛擬機(jī)、Btree算法、高整緩存、程序體系結(jié)構(gòu),通過(guò)這些內(nèi)容可以搞清楚很多計(jì)算機(jī)科學(xué)的經(jīng)典概念。的模塊化、小型化和簡(jiǎn)易性,使你可以很容易地專(zhuān)門(mén)管理員的數(shù)據(jù)庫(kù)不僅是程序員的數(shù)據(jù)庫(kù),它對(duì)系統(tǒng)管理員也很有用。它很小、緊湊而精致,就像一些Unix的常用工具,如find、rsync或grep。提供了命令行工具供用戶(hù)交互操作。另外,對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的初學(xué)者來(lái)說(shuō),是一個(gè)學(xué)習(xí)各種關(guān)系相關(guān)概念的方便的學(xué)U盤(pán)就能傳遞。的歷史從某個(gè)角度來(lái)說(shuō),最初的構(gòu)思是在一條軍艦上進(jìn)行的。的作者D.RichardHipp當(dāng)時(shí)正在為編制一種使用在 上的程序。那個(gè)程序最初是運(yùn)行在Hewlett-PackardUnix(HPUX)上,使用Informix數(shù)據(jù)庫(kù)。對(duì)那個(gè)程序來(lái)說(shuō),Informix有個(gè)數(shù)據(jù)庫(kù)將使用GNUDBMB-Treelibrary(gdbm)做,同時(shí)這個(gè)數(shù)據(jù)庫(kù)將不需要安裝和布了的1.0版。以支持事務(wù)和記錄按主鍵的。隨著最初的升級(jí),在功能和用戶(hù)數(shù)上都得到了穩(wěn)步的發(fā)展。在2001年中期,很多項(xiàng)目——開(kāi)源的或商業(yè)的——都開(kāi)始使用。在那以O(shè)DBC接口可以為Perl、Python、Ruby、Java和其它主流的程序設(shè)計(jì)語(yǔ)言提供支持,這證明了有廣闊的應(yīng)用前景。UTF-16及用戶(hù)定義字符集的支持。While3.0wasoriginallyslatedforreleaseinsummer2005,AmericaOnlineprovidedthenecessaryfundingtoseethatitwascompletedbyJuly2004.除國(guó)3CAPI,更緊湊的數(shù)據(jù)庫(kù)文件格式(比3240K字節(jié)。Anotherimprovementinversion3wasagoodcodecleanup—revisitingandrewriting,orotherwisethrowingoutextraneousstuffaccumulatedinthe2.xseries.持續(xù)增長(zhǎng)并始終堅(jiān)持其最初的設(shè)計(jì)目標(biāo):簡(jiǎn)單、彈性、緊湊、速度和徹底的易用。本書(shū)時(shí),已經(jīng)增加了CHECK約束,下面就要增加外鍵約束,再下面呢?誰(shuí)使用CoreDataSafariWeb瀏覽器、Mail.app的電子郵件程序、RSS的管理、Apple的Aperture軟件。擁有一個(gè)精致的、模塊化的體系結(jié)構(gòu),并引進(jìn)了一些獨(dú)特的方法進(jìn)行關(guān)系型數(shù)據(jù)庫(kù)語(yǔ)句,在中部執(zhí)行它,在底部處理操作系統(tǒng)的和接口。圖1-2的體系結(jié)接口接口由CAPI組成,也就是說(shuō)不管是程序、語(yǔ)言還是庫(kù)文件,最終都是通過(guò)它與交互的(我們經(jīng)常使用的ODBC/JDBC最后也會(huì)轉(zhuǎn)化為相應(yīng)CAPI的調(diào)用)。編譯器(StructuredQueryLanguage,SQL)語(yǔ)句,分析其語(yǔ)法有效性,轉(zhuǎn)化為底層能更方便處理的層次數(shù)據(jù)結(jié)構(gòu)——語(yǔ)法樹(shù),然后把語(yǔ)法樹(shù)傳給代碼(codegenerator)進(jìn)行處理。分詞器的代碼是手工編寫(xiě)的,分析器代碼是由定制的分析器(稱(chēng)為L(zhǎng)emon)生成的。TheLemonparsergeneratorisdesignedforhighperformanceandtakesspecialprecautionstoguardagainstmemoryleaks.一旦SQL語(yǔ)句被分解為串值并組織到語(yǔ)法樹(shù)中,分析器就將該 后由虛擬機(jī)(VirtualMachine)執(zhí)行。虛擬機(jī)(Virtual架構(gòu)中最的部分是虛擬機(jī),或者叫做虛擬數(shù)據(jù)庫(kù)引擎(VirtualDataBaseEngine,VDBE)。它和Java虛擬機(jī)相似,解釋執(zhí)行字節(jié)代碼。VDBE的字節(jié)代碼(稱(chēng)為虛擬機(jī)語(yǔ)言)128個(gè)操所有的SQL語(yǔ)句——從選擇和修改記錄到創(chuàng)建表、視圖和索引——都是首先編譯成此種虛擬機(jī)語(yǔ)言,組成一個(gè)獨(dú)立程序,定義如何完成給定令。例如,在的CLP>.mcol>.hon>.w41533310>exinSELECTnameFROMepisodesLIMIT1-1VDBE0000110210031040050203600702282109101007000000000000020050從多個(gè)方面都可以看出,VDBE是的:它上面的各模塊都是用于創(chuàng)建VDBE程序,它下面的各模塊都是用于執(zhí)行VDBE程序,每次執(zhí)行一條指令。后端(Back-B-tree、頁(yè)緩沖(pagecache,pager)和操作系統(tǒng)接口(即系統(tǒng)調(diào)用)構(gòu)成。B-treepage頁(yè)里面的“貨物”是表示信息的大量bit,這些信息包括記錄、字段和索引等。B-tree和pager都不知道信息的具體內(nèi)容,它們只負(fù)責(zé)“”這些頁(yè),頁(yè)不關(guān)心這些“集裝箱”B-tree的主要功能就是索引,它著各個(gè)頁(yè)之間的復(fù)雜的關(guān)系,便于快速找到所需數(shù)據(jù)。它把頁(yè)組織成樹(shù)型的結(jié)構(gòu)(這是它名稱(chēng)的由來(lái)),這種樹(shù)是為查詢(xún)而高度優(yōu)化了的。Page為B-tree服務(wù),為它提供頁(yè)。PagerOSB-tree和磁盤(pán)之間傳遞頁(yè)。磁盤(pán)操作是計(jì)算機(jī)到目前為止所必須做的最慢的事情。所以,pager盡力提高速度,其方法殊的算法來(lái)預(yù)測(cè)下面要使用哪些頁(yè),從而使B-tree能夠更快地工作。工具模塊中包含各種各樣的實(shí)用功能,還有一些如內(nèi)存分配、字符串比較、Unicode轉(zhuǎn)換之性能如此可靠的原因之一。的特色盡管是如此之小,卻提供了如此之多的特色和性能。它支持ANSISQL92的一個(gè)大庫(kù)的特色,如觸發(fā)器、索引、自動(dòng)增長(zhǎng)字段和LIMIT/OFFSET子句等。還有很多獨(dú)如本章開(kāi)始時(shí)所述,在的觀念中,都遵循著一系列指導(dǎo)原則。下面就來(lái)詳述零配置從的設(shè)計(jì)之始,就沒(méi)準(zhǔn)備在應(yīng)用時(shí)使用DBA。配置和管理就像得到它一樣簡(jiǎn)單。包含了正好適合于一個(gè)程序員的腦筋的特色。兼容性及在設(shè)計(jì)時(shí)特別注意了兼容性。它可以編譯運(yùn)行在Windows、Linux、BSD、MacOSX的Unix系統(tǒng)如Solaris、HPUX和AIX,還可以應(yīng)用于很多嵌入式平臺(tái)如QNX、體系結(jié)構(gòu)中并且能同時(shí)適應(yīng)字節(jié)的大端格式和小端格式。的兼容性并不只表現(xiàn)在代碼上,還表現(xiàn)在其數(shù)據(jù)庫(kù)文件上。的數(shù)據(jù)庫(kù)文件在其所支持的所有操作系統(tǒng)、硬件體系結(jié)構(gòu)和字節(jié)順序上都是二進(jìn)制一致的。你可以在SunSPARC工作站上創(chuàng)建一個(gè)轉(zhuǎn)換和修改。此外,數(shù)據(jù)庫(kù)可以支撐2TB的數(shù)據(jù)量(受操作系統(tǒng)限制),還內(nèi)及UTF-8UTF-16緊湊性170KBx86GNUC進(jìn)行編譯)。此外,還有一個(gè)的私有版本,大小是69KB,可以運(yùn)行在智能卡上(參“附簡(jiǎn)作為程序庫(kù),的API可以算是最簡(jiǎn)單最易用的了。既有很好的文檔又很容易適應(yīng)性的幾個(gè)特性使其成為一個(gè)適應(yīng)性極強(qiáng)的數(shù)據(jù)庫(kù)。作為一個(gè)內(nèi)嵌式的數(shù)據(jù)庫(kù),在以下兩個(gè)方面都做得最好:強(qiáng)有力而可伸縮的關(guān)系型數(shù)據(jù)庫(kù)前端,簡(jiǎn)單而緊湊的B-tree不受拘束的所有曾經(jīng)為項(xiàng)目貢獻(xiàn)過(guò)代碼的人都簽署過(guò)一個(gè)宣誓書(shū)將他們的貢獻(xiàn)發(fā)布到公共域。也就是說(shuō),無(wú)論你如何使用的代碼都不會(huì)有法律方面的限制。你可以修改、合并、可靠性的源代碼不但免費(fèi),還編寫(xiě)得很好。源代碼包含大約30000行標(biāo)準(zhǔn)C代碼,它是干凈的、模塊化的和完好注釋的。源代碼易理解、易定制。的軟件(庫(kù)和工具)由約30000行代碼組成,但分發(fā)的程序中還包含有超過(guò)30000行的回歸測(cè)試代碼,它們覆蓋了97%的代碼。也就是說(shuō),超過(guò)一半的項(xiàng)目代碼易用性還提供一些獨(dú)特的功能來(lái)提高易用性,包括動(dòng)態(tài)類(lèi)型、解決和“附加”多個(gè)數(shù) 性能和有些事情能比其它數(shù)據(jù)庫(kù)做得快,也有些事情不能。這么說(shuō)吧,利用提供的配置參數(shù),是足夠快速和高效的。跟大多數(shù)其它數(shù)據(jù)庫(kù)一樣,使用B-tree處理索引,使用B+tree處理表數(shù)據(jù)。因此,在對(duì)單表進(jìn)行查詢(xún)時(shí),要快于(或至少相當(dāng)在一些情況下可能不如大型數(shù)據(jù)庫(kù)快,但大多數(shù)這些情況是可理解的。是一戶(hù)錯(cuò)誤地假設(shè)使用可以代替大型關(guān)系型數(shù)據(jù)庫(kù),這有時(shí)行,但有時(shí)不行,依賴(lài)于你準(zhǔn)備用來(lái)做什么。一般情況下,在三個(gè)主要的方面具有局限性:GRANT和REVOKE有豐富的信息,包括文檔、郵件列表、Wiki和其它的一般信息,它的 。e社區(qū)也是很有幫助的,你可能從郵件列表中找到任何你所需要的東西。另外,的作者提供了的專(zhuān)業(yè)培訓(xùn)和支持,包括定制程序(如移植到嵌入式平臺(tái))和增強(qiáng)的版本,這些版本包括內(nèi)置了加密功能的版本和為嵌入式應(yīng)用優(yōu)化的極小化版本。的信息可以從 lite/prosupport.html中找到。2章無(wú)論您使用何種操作系統(tǒng),都很容易上手。對(duì)大多數(shù)用戶(hù),安裝并創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)不會(huì)超過(guò)5分鐘,且不需要任何經(jīng)驗(yàn)。從哪得到 )同時(shí)提供的已編譯版本和源程序。編譯版本可同時(shí)適用于Windows和Linux。動(dòng)態(tài)庫(kù)(DLL)Windows下編譯,另一種POSIX平臺(tái)(LinuxBSD,andSolaris)下編譯,這兩種形式下源代碼本身是沒(méi)有差Windows上使用無(wú)論你是作為終端用戶(hù)還是作為程序員來(lái)使用,都可以很容易地安裝在獲得命令行程序獲得的動(dòng)態(tài)庫(kù)的DLL文件供編譯好的程序動(dòng)態(tài)連接。大多數(shù)使用的軟件都會(huì)擁有自己的DLL拷貝并隨軟件自動(dòng)安裝。在Windows環(huán)境下編譯源代介紹。關(guān)于使用其它編譯器編譯的內(nèi)容,可參考Wiki 用VisualC++構(gòu)建啟動(dòng)VisualStudio。在解包的源程序 將全部源文件加入到項(xiàng)目中來(lái)。包括所有的.c文件和.h文件。除了: .c:該文件包括main()函數(shù),用于創(chuàng)建CLP tcl.c:該文件用于TCL支持。知會(huì)引起什么,它們是fts3.c和fts3_tokenizer.c。還可以選擇構(gòu)建線程完全的DLL(Release)版的DLL用VisualC++構(gòu)建使用數(shù)據(jù)它可運(yùn)行于多種平臺(tái),學(xué)會(huì)使用CLP,可以保證你有一個(gè)通用和熟悉的途徑來(lái)管理你的數(shù)據(jù)庫(kù)。CLP其實(shí)是兩個(gè)程序。它可以運(yùn)行在命令行模式下完成各種數(shù)據(jù)庫(kù)管理任務(wù),也可以運(yùn)行在S模式下,以交互的方式執(zhí)行查詢(xún)操作。S運(yùn)行DOSs,進(jìn)入工作,在命令行上鍵入3命令,命令后跟隨一個(gè)可選的數(shù)據(jù)庫(kù)文件名。如果在命令行上不指定數(shù)據(jù)庫(kù)名,將會(huì)使用一個(gè)內(nèi)存數(shù)據(jù)庫(kù),其內(nèi)容在退出CLP時(shí)將會(huì)丟失。是以點(diǎn)(.)開(kāi)始,這些命令用于特殊操作。鍵入.help或.h可以得到這些操作的完整列表。鍵入.exit或.e退出CLP。3小等。有些設(shè)置,如頁(yè)大小、字符集(UTF-8UTF-16)等,一旦數(shù)據(jù)庫(kù)創(chuàng)建之后就不能再>createtabletest(idintegerprimarykey,valueid的主鍵字段,它帶有自動(dòng)增長(zhǎng)屬性。無(wú)論何時(shí)你定義一個(gè)整型主鍵字段,都會(huì)對(duì)該字段應(yīng)用自動(dòng)增長(zhǎng)屬性。>insertintotest(value)values('eenie');>insertintotest(value)values('meenie');>insertintotest(value)values('miny');>insertintotest(value)values('mo');>.modecol>.headerson>SELECT*FROMidSELECT語(yǔ)句前的兩個(gè)命令(.headersand.mode)用于改進(jìn)輸出的格式??梢钥吹綖閕d>selectlast_insert_rowid();4CLP之前,讓我們來(lái)為數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)索引和一個(gè)視圖,后面的內(nèi)容中將會(huì)用到它>createindextest_idxontest>createviewschemaasselect*from使用.exit命令退出CLP。>.exit獲得數(shù)據(jù)庫(kù)的Schema信息有幾個(gè)s命令用于獲得有關(guān)數(shù)據(jù)庫(kù)內(nèi)容的信息。你可以鍵入命令.tables[pattern]來(lái)得到所件的所有表和視圖,如果沒(méi)有pattern項(xiàng),返回所有表和視圖。>schematestschema。同樣的,要顯示一個(gè)表的索引,可以鍵入命令.indices[tablename]:>.indicestesttesttest_idx的索引。使用.schema[tablename]可以得到一view和index)的定義語(yǔ)句:>.schemaCREATETABLEtest(idintegerprimarykey,valuetext);CREATEINDEXtest_idxontest(value);>CREATETABLEtest(idintegerprimarykey,valuetext);CREATEVIEWschemaasselect*from_master;CREATEINDEXtest_idxontest(value);一個(gè)系統(tǒng),它的結(jié)構(gòu)如表2-1所示。表2-1_master表結(jié)12345>.modecol>selecttype,name,tbl_name,sqlfrom_masterorderbyINDEXontestTABLEtestintegerVIEWschemaselect*from數(shù)據(jù)導(dǎo)數(shù)據(jù)庫(kù)。如果提供參數(shù),CLP把參數(shù)理解為表名或視圖名。>.output>>.output數(shù)據(jù)導(dǎo)SQL語(yǔ)句構(gòu)成,可以使用.read命令導(dǎo)入(執(zhí)行)文件。如果文件是由逗號(hào)或其它定界符分隔的值(comma-separatedvaluesCSV)組成,可使用.importfile][table]命令。此命令將解析指定的文>.showecho:offexin:offheaders:onmode:columnnullvalue:""output:stdoutseparator:"|".read命令用來(lái)導(dǎo)入由.dump命令創(chuàng)建的文件。如果要使用前面作為備份文件所導(dǎo)出的file.sql,需要先移除已經(jīng)存在的數(shù)據(jù)庫(kù)對(duì)象(testschema視圖),然后用下面方法導(dǎo)入:>droptabletest;>dropviewschema;>.readfile.sql格式CLP提供了幾個(gè)格式化選項(xiàng)命令。最簡(jiǎn)單的是.echo,如果設(shè)置.echoon,則新輸入令在off。.headerson時(shí),查詢(xún)結(jié)果顯示時(shí)帶有字段名。當(dāng)遇到NULL值時(shí),如果需要以一個(gè)字符串來(lái)顯示,使用.nullvalue命令設(shè)置,如:>.nullvalue默認(rèn)情況下使用空串。如果要改變CLP的s 提示符,使用.prompt[value],如:>.prompt'3>'.modecsv、column、html、insert、line、list、tabstcllist,在此模式下顯示結(jié)果時(shí)列間以默認(rèn)的分隔符分隔。如果你想以CSV格式輸出一個(gè)表的數(shù)據(jù),可如下操作:3>.output3>.separator,3>select*fromtest;3>.outputstdout3>.output3>.modecsv3>select*fromtest;3>.outputstdout在命令行方式下執(zhí)行數(shù)據(jù)庫(kù)所有的數(shù)據(jù)庫(kù)管理任務(wù)都可以在 創(chuàng)建、備份和刪除數(shù)據(jù)3test.db.dumptest.sql在CLP中可如下做:>.outputfile.sql>.dump>.exit3test.db<可以用的方法得到一個(gè)二進(jìn)制的數(shù)據(jù)庫(kù)文件拷貝。但也許在之前你想先抽空cptest.dbtest.backupSQL格式獲得數(shù)據(jù)庫(kù)文件的信息如果你想獲得關(guān)于物理的數(shù)據(jù)庫(kù)結(jié)構(gòu)信息,可以使用一個(gè)稱(chēng)為yzer的工具,它可以在上得到。yzer可以提供磁盤(pán)數(shù)據(jù)庫(kù)的詳細(xì)技術(shù)信其它工) ) ControlCenter(http: Manager 3系模SQL的出現(xiàn)提出了需求。SQL的原動(dòng)力不在語(yǔ)言本身,而是深藏在關(guān)系模型的概念當(dāng)中。這些概念構(gòu)成了SQL設(shè)計(jì)和操作的基礎(chǔ)。4模型的基礎(chǔ)知識(shí)。如果你是SQL新手,將帶你進(jìn)入關(guān)系模型的世界??兆ⅲ菏褂眠^(guò)很多種數(shù)據(jù)庫(kù),所以本章只關(guān)注與其它DBMS不同的地方,如弱類(lèi)型如第3章所述,SQL是關(guān)系模型的產(chǎn)物,關(guān)系模型是由E.F.Codd在1969年。關(guān)系模型要求關(guān)系型數(shù)據(jù)庫(kù)能夠提供一種查詢(xún)語(yǔ)言,幾年后,SQL應(yīng)運(yùn)而生。結(jié)構(gòu)。在關(guān)系模型中只使用一種單獨(dú)的數(shù)據(jù)結(jié)構(gòu)來(lái)表達(dá)所有信息,這種結(jié)構(gòu)稱(chēng)為關(guān)系rows)構(gòu)成,每個(gè)元組又由多個(gè)屬性(attributes,在SQL中被稱(chēng)為列、字段、columns)構(gòu)成。SQL庫(kù)的研究項(xiàng)目,此項(xiàng)目直接派生出了Codd的。這個(gè)語(yǔ)言開(kāi)始時(shí)被稱(chēng)作SEQUEL,是“StructuredEnglishQueryLanguage”的縮寫(xiě)。后來(lái)被縮短為SQL,或“StructuredQuery示例數(shù)示例數(shù)據(jù)庫(kù)在本章和后面的章節(jié)中將會(huì)用到,其中了Seinfeld所有episode(約180個(gè))的食品(約412種)。數(shù)據(jù)庫(kù)中的表如圖4-1所示。圖4-1Seinfeld食品數(shù)據(jù)庫(kù)createtableepisodesidintegerprimarykey,seasonint,nametext);idintegerprimarykey,type_idinteger,nametext);createtablefood_types(idintegerprimarykey,nametext);createtablefoods_episodes(food_id主表是foods。foods中的每條記錄代表一種食品,其名稱(chēng)于name字段。type_id參照表是foods和episodes的關(guān)聯(lián)表。建示例數(shù)據(jù)庫(kù)文件可在隨書(shū)的zip 3foods.db<.echo.mode.headers語(yǔ)SQL的語(yǔ)法很像自然語(yǔ)言。每個(gè)語(yǔ)句都是一個(gè)祈使句,以動(dòng)詞開(kāi)頭,表示所要做的動(dòng)作。后面跟的是和謂詞,如圖4-2所示。4-2SQL命SELECTid,nameFROMINSERTINTOfoodsVALUES(NULL,'Whataburger');DELETEFROMfoodsWHEREid=413;常也稱(chēng)為L(zhǎng)i 的16進(jìn)制數(shù)(8bits)組成,如:保留字和標(biāo)識(shí)符SQLSELECT、UPDATE、INSERT、CREATE、DROPBEGIN等。標(biāo)識(shí)符指明數(shù)據(jù)庫(kù)里的具體對(duì)象,如表或索引。保留字預(yù)定義,不能用做標(biāo)識(shí)符。SQL不區(qū)分大小寫(xiě),下面是相同的語(yǔ)句:SELECT*fromfoo;SeLeCt*FrOmFOO;但是,對(duì)字符串的值是大小寫(xiě)敏感的。注SQL中單行注釋減號(hào)開(kāi)始,多行注釋采用C風(fēng)格的/**/形式創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)2分鐘的時(shí)間給出一個(gè)預(yù)覽。創(chuàng)建表DDL),操作這些對(duì)象中數(shù)據(jù)的語(yǔ)句稱(chēng)為數(shù)據(jù)操作語(yǔ)言(datamanipulationlanguage,DML)。創(chuàng)建表的語(yǔ)句屬于DDL,用CREATETABLE命令,如下定義:用TEMP或TEMPORARY保留字的表為臨時(shí)表,只存活于當(dāng)前會(huì)話,一旦連接斷開(kāi),UNIQUE約束來(lái)規(guī)定所有記錄中某個(gè)字段的值要各不相同。約束將會(huì)在“數(shù)據(jù)完整性”一CREATETABLEcontacts(idINTEGERPRIMARYKEY,nameTEXTNOTNULLCOLLATENOCASE,phoneTEXTNOTNULLDEFAULT'UNKNOWN',改變表你可以用ALTERTABLE命令改變表的結(jié)構(gòu)。版的ALTERTABLE命令既可以改變Thatis,youcaneitherrenamethetableusingtheRENAMEclause,oraddacolumnwiththeADDCOLUMNclause.Torenameatable,yousimplyprovidethenewnamegivenbyname.Ifyouaddacolumn,thecolumndefinition,denotedbycolumn_def,followstheformintheCREATETABLEstatement.Itisaname,followedbyan andlistofADD >.schemanameTEXTNOTNULLCOLLATENOCASE,TABLE語(yǔ)句將在“插入記錄”一節(jié)中介紹。在數(shù)據(jù)庫(kù)中查詢(xún)....Assign(OR賦值..Generalized.LeftOuter.RightOuter.FullOuterANSISQLSELECTCodd最初定義的所有關(guān)系運(yùn)算符,只有一個(gè)例外——divide。支持ANSISQL中除right和fullouterjoinSELECTDISTINCTheadingFROMtablesWHEREpredicateGROUPBYcolumnsHAVINGpredicate每個(gè)保留字——DISTINCT、FROM、WHEREHAVING——都是一個(gè)單獨(dú)的子句。每個(gè)1Listof2Logical3ORDERListof4Listof5Logical6Listofcolumnsor7Listof894-3SELECT過(guò)值值可以表現(xiàn)為文字的值(1,2,3orJujyFruit”)、變量(的列名)、表達(dá)式操作4-7二目操作符*/%+–RightLeft&|<Less*/%+–RightLeft&|<LessLessthanorequal>GreaterGreaterthanorequal=EqualEqualNotequalNotequalLIKELIKE。LIKE的作用與相等(=)很像,但卻是通過(guò)一個(gè)模板來(lái)進(jìn)>SELECTid,nameFROMfoodsWHEREnameLIKE'J%';idname156Juice236JuicyFruit243Jellowith244245Junior370>SELECTid,nameFROMfoodsWHEREnameLIKE'%ac%P%';idname127Guacamole168Peach198Mackinaw另一個(gè)有用的竅門(mén)是使用NOT:SELECTid,nameFROMfoodsWHEREnamelike'%ac%P%'ANDnameNOTLIKE'%Sch%'idname38Pie(Blackberry)Pie127GuacamoleDip198Mackinaw限定和LIMITOFFSET保留字限定結(jié)果集的大小和范圍。LIMIT指定返回記錄的最大數(shù)SELECT*FROMfood_typesLIMIT1OFFSET1ORDERBYid;保留字OFFSET在結(jié)果集中跳過(guò)一行(Bakery),保留字LIMIT限制最多返回一行(Cereal)。>SELECT*FROMfoodsWHEREnameLIKEORDERBYtype_idDESC,nameLIMIT10;idtype_idname38215Baked38315BakedPotato38415Big38515362143281232712BaconClub(no3261232912Brisket27410函數(shù)(Function)和聚合提供了多種內(nèi)置的函數(shù)和聚合,可以用在不同的子句中。函數(shù)的種類(lèi)包括:數(shù)學(xué)函 ')LENGTH(' o')ABS(-12) 1212函數(shù)名是不分大小寫(xiě)的(或upper()和UPPER()是同一個(gè)函數(shù))。函數(shù)可以接受字段值作為參>SELECTid,UPPER(name),LENGTH(name)FROMfoodsWHEREtype_id=1LIMIT10;BAGELSBLACKANDWHITESBREAD(WITHNUTS)CARROTCAKECHIPSAHOYS>SELECTid,UPPER(name),LENGTH(name)FROMfoodsWHERELENGTH(name)<5LIMIT5;36PIE348BRAN56KIX57LIFE80DUCKCOUNT()、MIN()MAX()。例如,要得到烘烤食品(type_id=1)的數(shù)量,可使用如下語(yǔ)句:>SELECTCOUNT(*)FROMfoodsWHEREtype_id=1;分組(Grou>SELECTtype_idFROMfoodsGROUPBYtype_id;123..的行。例如,你想從foods表中取得所有不同的type_id值:>SELECTDISTINCTtype_idFROMfoods;123..連接(join)SELECT命令的第一個(gè)操作,它產(chǎn)生初始的信息,供語(yǔ)句的其它部分過(guò)濾和處理。連接的結(jié)果是一個(gè)合成的關(guān)系(或表),它是SELECT后繼操作的輸入。FROMfoods,food_typesnamenameBagelsBakeryBagels,raisinBakeryBavarianCreamPieBakeryBearClawsBakeryBlackandWhite sBakeryBread(withnuts)BakeryButterfingersBakeryCarrotCakeChipsAhoy ChocolateBobkaBakery名稱(chēng)和SELECTB.nameFROMAJOINBUSING修改數(shù)據(jù)——INSERT、UPDATE和DELETE。Table指明數(shù)據(jù)插入到哪個(gè)表中。column_list是用逗號(hào)分隔的字段名表,這些字段必須是表下面語(yǔ)句向foods表插入數(shù)據(jù):UPDATE命令用于修改一個(gè)表中的記錄。UPDATE命令可以修改一個(gè)表中一行或多行中的一個(gè)或多個(gè)字段。UPDATE語(yǔ)句的一般格式為:update_listcolumn_name=value。WHERE子句的用法與SELECT語(yǔ)句相同,確定需要進(jìn)行修改的記錄。如:SELECT*FROMfoodsWHEREnameLIKEidtype_111Chocolate121ChocolateCream2229Chocolates,box2239ChocolateChip2249ChocolateCoveredDELETEFROMtableWHERE數(shù)據(jù)完實(shí)體完唯一約因?yàn)槲ㄒ籙NE)約束是主鍵的基礎(chǔ),所以先介紹它。一個(gè)唯一約束要求一個(gè)字段或一組存值據(jù)個(gè)并操。約以段表義。NULL和Oracle相同的解決方案。NULLNULL值是否相等?你沒(méi)有足夠的信息來(lái)證明它們相等,但也沒(méi)有足夠的信息證明它們不等。的觀點(diǎn)是假設(shè)所有的NULL都是不同的。所以你可以向唯一字段中插入任意多個(gè)NULL值。主鍵約在中,當(dāng)你定義一個(gè)表時(shí)總要確定一個(gè)主鍵,不管你自己有沒(méi)有定義。這個(gè)字段是同樣可以取到它的值。它的默認(rèn)取值按照增序自動(dòng)生成。為主鍵字段提供自動(dòng)增長(zhǎng)默認(rèn)定值,則為它賦默認(rèn)值。DEFAULT不是一個(gè)約束(constraint),因?yàn)樗鼪](méi)有強(qiáng)制任何事情。這所以把它歸為域完整性,是因?yàn)樗峁┝颂幚鞱ULL值的一個(gè)策略。如果一個(gè)字段沒(méi)有指定默認(rèn)址,在插入時(shí)也沒(méi)有為該字段指定值,將向該字段插入一個(gè)NULL。例如,字段有一個(gè)默認(rèn)值'UNKNOWN',請(qǐng)看下面例子:>INSERTINTOcontacts(name)VALUES('Jerry');>SELECT*FROMcontacts;idnamephoneDEFAULT還可以接受3種預(yù)定義格式的ANSI/ISO合(格式為YYYY-MM-DDHH:MM:SS)。例如:INSERTINTOtimes(1);iddatetimetimestamp12006-03-1523:30:252006-03-1522006-03-1523:30:402006-03-15NOTNULLCHECK排序法逐字節(jié)的比較。這很適合于大多數(shù)西方語(yǔ)言,如英語(yǔ)。NOCASE26個(gè)字母是大小寫(xiě)不敏感的。FinallythereisREVERSE,whichisthereverseoftheBINARYcollation.REVERSEismorefortesting(andperhapsillustration)thananything類(lèi)(Storage如前文所述,在處理數(shù)據(jù)類(lèi)型時(shí)與其它的數(shù)據(jù)庫(kù)不同。區(qū)別在于它所支持的類(lèi)型以對(duì)于數(shù)據(jù)類(lèi)型,的域完整性被稱(chēng)為域親和性(affinity)更合適。在中,它被稱(chēng)有5個(gè)原始的數(shù)據(jù)類(lèi)型,被稱(chēng)為類(lèi)。類(lèi)這個(gè)詞表明了一個(gè)值在磁盤(pán)上的格式,其實(shí)就是類(lèi)型或數(shù)據(jù)類(lèi)型的同義詞。這5個(gè)類(lèi)在表4-6中描述。表4- 整數(shù)值是全數(shù)字(包括正和負(fù))1,2,3,4,68最大范圍(8bytes)是{- 8,0, 根據(jù)數(shù)字的值自動(dòng)控制整數(shù)所占的字節(jié)數(shù)。X前綴大小寫(xiě)皆可。>selecttypeof(3.14),typeof('3.14'),typeof(314),typeof(x'3142'),typeof(NULL);typeof(3.14)typeof('3.14')typeof(314)typeof(x'3142')typeof(NULL) >DROPTABLE>INSERTINTOVALUES(3.142);>INSERTINTOVALUES('3.142');>INSERTINTOVALUES(3142);>INSERTINTO VALUES(x'3142');>INSERTINTO VALUES(NULL);>SELECTROWID,x,typeof(x)FROM x12345這帶來(lái)一些問(wèn)題。這種字段中的值如何和比較?如何對(duì)一個(gè)包含了INTEGER、REAL、TEXTBLOB和NULL值的字段排序?一個(gè)整數(shù)和一個(gè)BLOB如何比較?哪個(gè)更大?它們NULL類(lèi)具有最低的類(lèi)值。一個(gè)具有NULL類(lèi)的值比所有其它值都小(包括其它具有NULL類(lèi)的值)。在NULL值之間,沒(méi)有特別的可排序值。INTEGER或REAL類(lèi)值高于NULL,它們的類(lèi)值相等。INTEGER值和REAL值通TEXT類(lèi)的值比INTEGER和REAL高。數(shù)值比字符串的值低。當(dāng)兩個(gè)TEXT值比較時(shí)使用C函數(shù)memcmp()。>SELECT3<3.142,3.142<'3.142','3.142'<x'3000',x'3000'<3<3.142<'3.142'<x'3000'<1111弱類(lèi)型(manifestty使用弱類(lèi)型。ytext,zreal);TEXT和REAL如果你愿意,可以為的字段定義類(lèi)型,這看起來(lái)跟其它數(shù)據(jù)庫(kù)一樣。但這不是必須的,你可以盡管類(lèi)型定義。這是因?yàn)樵谌魏吻闆r下,都可以接受一個(gè)值并推斷性介紹這兩個(gè)規(guī)定如何相互關(guān)聯(lián)。所謂類(lèi)型親和性就是在強(qiáng)類(lèi)型(strictty)和動(dòng)態(tài)類(lèi)型(dynamicty)之間的平衡藝術(shù)。類(lèi)型親和性(Type在中,字段沒(méi)有類(lèi)型或域。當(dāng)給一個(gè)字段了類(lèi)型,該字段實(shí)際上僅僅具有了該類(lèi)型的新和性。類(lèi)型和類(lèi)型親和性是兩回事。類(lèi)型親和性預(yù)定用什么類(lèi)在字段中值。在一個(gè)給定的值時(shí)到底會(huì)在該字段中用什么類(lèi)決定于值的字段類(lèi)型和親和性首先,每個(gè)字段都具有一種親和性。共有四種親和性:NUMERIC、INTEGER、TEXT和上說(shuō)是為字段指定了親和性。按下面的規(guī)則為字段指派親和性:如果為字段的類(lèi)型中包含了'CHAR'、'CLOB'或'TEXT'(無(wú)論大小寫(xiě)),該字段被指派為T(mén)EXT親和性。如'VARCHAR'包含了'CHAR',所以被指派為T(mén)EXT親和性。如果為字段的類(lèi)型中包含了'BLOB'(無(wú)論大小寫(xiě)),或者沒(méi)有為該字段類(lèi)型,該字段被指派為NONE親和性。性是NUMERIC。例如,如果為一定字段了類(lèi)型JUJYFRUIT,該字段的親和性不是NONE,因?yàn)椴徽J(rèn)識(shí)這種類(lèi)型,會(huì)給它指派默認(rèn)的NUMERIC親和性。所以,與其N(xiāo)UMERIC親和性,還不如不為它指定類(lèi)型,從而使它得到NONE親和性。親和性一個(gè)NUMERIC字段可能包括所有5種類(lèi)。一個(gè)NUMERIC字段具有數(shù)字類(lèi)的偏好(INTEGER和REAL)。當(dāng)一個(gè)TEXT值入到一個(gè)NUMERIC字段,將會(huì)試圖將其轉(zhuǎn)化為INTEGER類(lèi);如果轉(zhuǎn)化失敗,將會(huì)試圖將其轉(zhuǎn)化為REAL類(lèi);如果還是失敗,將會(huì)用TEXT類(lèi)來(lái)。類(lèi)。INTEGER字段將會(huì)試著將TEXT值按REAL;如果轉(zhuǎn)化失敗,將會(huì)試圖將其轉(zhuǎn)化為INTEGER類(lèi);如果還是失敗,將會(huì)用TEXT類(lèi)來(lái)一個(gè)TEXTINTEGERREAL值轉(zhuǎn)化為T(mén)EXTNULLBLOB值轉(zhuǎn)化——如無(wú)論用什么親和性。NULLBLOB值這些規(guī)則初看起來(lái)比較復(fù)雜,但總的設(shè)計(jì)目標(biāo)很簡(jiǎn)單,就是:如果你需要,會(huì)盡量模仿其它的關(guān)系型數(shù)據(jù)庫(kù)。也就是說(shuō),如果你將看成是一個(gè)傳統(tǒng)數(shù)據(jù)庫(kù),類(lèi)型親和性將會(huì)按你的期望來(lái)值。如果你了一個(gè)INTEGER字段,并向里面放一個(gè)整數(shù),就親和性的運(yùn)行>CREATETABLE(iint,nnumeric,ttext,bblob);>INSERTINTOVALUES(3.142,3.142,3.142,3.142);>INSERTINTOVALUES('3.142','3.142','3.142','3.142');>INSERTINTOVALUES(3142,3142,3142,3142); 12345>SELECTROWID,b,typeof(b)FROMORDERBYrowidb13.1423314223.14241B>SELECTROWID,b,typeof(b),b<1000 ORDERBYrowidbtypeof(b)b<1000NULLnullNULL13.142real33142integer23.142text41Bblob類(lèi)和類(lèi)型轉(zhuǎn)換有時(shí)在進(jìn)行比較之前,會(huì)將值在數(shù)字類(lèi)(INTEGER和REAL)和TEXT之間進(jìn)行轉(zhuǎn)換。有,NUMERIC親和性會(huì)應(yīng)用于非NUMERIC字段的TEXT值。當(dāng)兩個(gè)表達(dá)式進(jìn)行比較,不做任何轉(zhuǎn)換。如果兩個(gè)表達(dá)式有相似的類(lèi),則>selectROWID,b,typeof(i),i>'2.9'fromORDERBYb;rowidbtypeof(ii>'2.9'5NULLnullNULL13.142real133142integer23.142real41Bblob也算是“強(qiáng)類(lèi)型(STRICTTY內(nèi)置函數(shù)和一個(gè)CHECK約束來(lái)實(shí)現(xiàn)一個(gè)“”強(qiáng)類(lèi)型。事事務(wù)的3個(gè)命令控制:、MITROLLBACK。BEGIN開(kāi)始一個(gè)事務(wù),之后的所有操作都可以取消。COMMITBEGINROLLBACK還原BEGIN之后的所有操作。如:>>DELETEFROMfoods;>ROLLBACK;>SELECTCOUNT(*)FROMfoods;執(zhí)行SELECT時(shí)發(fā)現(xiàn)表中沒(méi)發(fā)生任何改變。默認(rèn)情況下,每條SQL語(yǔ)句自成事務(wù)(自動(dòng)提交模式)。解>UPDATEfoodsSETid=800- CE:當(dāng)發(fā)了唯一完整性,將造成這種的記錄刪除,替代以新插入或修改的新記錄,SQL繼續(xù)執(zhí)行,不報(bào)錯(cuò)。在中,鎖和事務(wù)是緊密聯(lián)系的。為了有效地使用事務(wù),需要了解一些關(guān)于如何加鎖采用粗放型的鎖。當(dāng)接要寫(xiě)數(shù)據(jù)庫(kù),所有其它的連接被鎖住,直到寫(xiě)連接結(jié)束了它的事務(wù)。有一個(gè)加鎖表,來(lái)幫助不同的寫(xiě)數(shù)據(jù)庫(kù)都能夠在最后一刻再加鎖,使用鎖逐步上升機(jī)制,為了寫(xiě)數(shù)據(jù)庫(kù),連接需要逐級(jí)地獲得排它鎖。有5個(gè)甚至已經(jīng)用BEGIN開(kāi)始了一個(gè)事務(wù)時(shí),連接都還處于未加鎖狀態(tài)。死4-7所假設(shè)的情況。兩個(gè)連接——A和B——同時(shí)但完全獨(dú)立地工作于同一個(gè)數(shù)據(jù)庫(kù)。A執(zhí)行第1條命令,B執(zhí)行第2、3條,等等。4-7AB>>>SELECT*FROM>SQLerror:databaseisSQLerror:databaseis當(dāng)其INSERT語(yǔ)句試圖將共享鎖提升為保留鎖時(shí)失敗。AB都一直等待數(shù)據(jù)庫(kù)可寫(xiě)。那么此時(shí),其它的連接甚至都A和B不能工作,其它所有進(jìn)程都不能再操作此數(shù)據(jù)庫(kù)了。AB通過(guò)談判解決,因?yàn)樗鼈兩踔敛恢辣舜说拇嬖?。事?wù)的種或EXCLUSIVE。事務(wù)類(lèi)型在BEGIN命令中指定:BEGIN[DEFERRED|IMMEDIATE|EXCLUSIVE]一個(gè)DEFERRED事務(wù)不獲取任何鎖(直到它需要鎖的時(shí)候),BEGIN語(yǔ)句本身也不會(huì)做什么事情——它開(kāi)始于UNLOCK狀態(tài)。默認(rèn)情況下就是這樣的,如果僅僅用BEGIN開(kāi)始一個(gè)作時(shí),它會(huì)獲取SHARED鎖;同樣,當(dāng)進(jìn)行第一次寫(xiě)操作時(shí),它會(huì)獲取 由BEGIN開(kāi)始的IMMEDIATE事務(wù)會(huì)嘗試獲取 鎖。如果成功,BEGIN 鎖會(huì)其它連接的BEGINIMMEDIATE或者BEGINEXCLUSIVE命令,當(dāng)其它連接執(zhí)行上述命令時(shí),會(huì)返回_BUSY錯(cuò)誤。這時(shí)你就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改操作了,但是你還不能提交,當(dāng)你COMMIT時(shí),會(huì)返回_BUSY錯(cuò)誤,這意旦成功,EXCLUSIVE事務(wù)保證沒(méi)有其它的連接,所以就可對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)操作了。最終,SHAREDBEGINIMMEDIATE開(kāi)始事務(wù),它的連接就得等待。BEGINIMMEDIATE和BEGINEXCLUSIVE通常被寫(xiě)事務(wù)使用。就像基本的準(zhǔn)則是:如果你正在使用的數(shù)據(jù)庫(kù)沒(méi)有其它的連接,用BEGIN就足夠了。但是,如BEGINIMMEDIATE或BEGINEXCLUSIVE開(kāi)始你的事務(wù)。數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)管理用于控制數(shù)據(jù)庫(kù)如何操作。從SQL的角度,數(shù)據(jù)庫(kù)管理包括一些如會(huì)視圖(view)、觸發(fā)器(trigger)和索引(indexe)。另外,包括自己一些獨(dú)特的管理,如數(shù)據(jù)庫(kù)視物化的視圖索索引的利用如果可能,在WHERE子名中有下列表達(dá)式時(shí),將使用單字段索引:columnIN(expression-list)columnIN(subquery)觸發(fā)器UPDATE觸發(fā)器ThegeneralformofthiskindoftriggerisasCREATETRIGGERname[BEFORE|AFTER]UPDATEOFcolumnONtableThefollowingisaSQLscriptthatshowsanUPDATEtriggerin.h.m.w.echoCREATETEMPTRIGGERfoods_update_logUPDATEofnameONfoodsINSERTINTOlogVALUES('updatedfoods:newname='||NEW.name);SELECT*FROMlog;錯(cuò)誤處完整性約束。為觸發(fā)器提供了一個(gè)稱(chēng)為RAISE()的特殊SQL函數(shù),可以在觸發(fā)器體中喚起一個(gè)錯(cuò)誤。RAISE如下定義:使用觸發(fā)器的外鍵約束在中,觸發(fā)器最有趣的應(yīng)用之一是實(shí)現(xiàn)外鍵約束。為了進(jìn)一步了解觸發(fā)器,我將用這個(gè)想法在foods表和food_types表之間實(shí)現(xiàn)外鍵。附加(Attaching)數(shù)據(jù)據(jù)庫(kù),它的所有內(nèi)容在當(dāng)前數(shù)據(jù)庫(kù)文件的全局范圍內(nèi)都是可存取的。ATTACH的語(yǔ)法為:ATTACH[DATABASE]filenameASdatabase_name;清潔數(shù)REINDEXcollation_name;數(shù)據(jù)庫(kù)連接緩沖區(qū)大小PRAGMAcache_size=10000;>PRAGMAcache_size;獲得數(shù)據(jù)庫(kù)信息index_info:Listsinformationaboutthecolumnswithinanindex.Ittakesanindexnameasanargument.index_list:Listsinformationabouttheindexesinatable.Ittakesatablenameasantable_info:Listsinformationaboutallcolumnsinaseqnamefile0main2db2>CREATEINDEXfoods_name_type_idxONfoods(name,type_id);>PRAGMAindex_info(foods_name_type_idx);seqncid0211>PRAGMAindex_list(foods);seqnameunique>PRAGMAtable_info(foods);cidnametypenotndfltpk0idinteger01type_idinteger02nametext0頁(yè)大小、編碼和自動(dòng)排空Thedatabasepagesize,encoding,andautovacuumingmustbesetbeforeadatabaseiscreated.Thatis,inordertoalterthedefaults,youmustfirstsetthesepragmasbeforecreatinganyobjectsinanewdatabase.Thedefaultsarea1,024-bytepagesizeandUTF-8encoding.supportspagesizesrangingfrom512to32,786bytes,inpowersof2.SupportedencodingsareUTF-8,UTF-16le(little-endianUTF-16encodingandUTF-16be(big-endianUTF-16encoding).據(jù)庫(kù)中刪除了數(shù)據(jù)并提交后,數(shù)據(jù)庫(kù)文件的大小保持不變。當(dāng)使用了auto_vacuumpragma系統(tǒng)表>SELECTtype,name,rootpageFROM_master; episodes foods _master包含一個(gè)稱(chēng)為sql的字段,了創(chuàng)建對(duì)象的DDL命令,如:>SELECTsqlFROM_masterWHEREname='foods_update_trg';CREATETRIGGERfoods_update_trgBEFOREUPDATEOFtype_idONfoodsWHEN(SELECTidFROMfood_typesWHEREid=NEW.type_id)ISNULLTHENRAISE(ABORT,'ForeignKeyViolation:foods.type_idisnotinfood_types.id')Query的執(zhí)可以用EX IN命令查看執(zhí)行一個(gè)查詢(xún)的方法。EX IN列出一個(gè)SQL命令編譯后的VDBE程序。>.mcol>.hon>.w41533310> INSELECT*FROM0000100207033090401050126023713080409000000000000700205章設(shè)計(jì)和概本章為后面的3章打下基礎(chǔ),這幾章專(zhuān)注于編程。這幾章專(zhuān)注于作為程序員,在編它的編程語(yǔ)言,這些內(nèi)容都是重要的。它不僅幫助你了解API,還包括部分有關(guān)的更快,且不會(huì)產(chǎn)生死鎖、不可預(yù)知錯(cuò)誤等問(wèn)題。你會(huì)看到如何處理你的代碼,你還你不需要從頭到尾地讀內(nèi)部代碼才能理解這些內(nèi)容,你也不必是一個(gè)C程序員。的示了主要的數(shù)據(jù)結(jié)構(gòu),API的一般設(shè)計(jì)和它主要的函數(shù)。還可以看到的一些主要的事務(wù)(transactions)中是如何操作的。的所有的工作都是在事務(wù)中完成的。于是,你需API之下,事務(wù)如何按照鎖的約束來(lái)工作。如果你不知道鎖是如何操作的,這些最后,你還必須理解如何將這些內(nèi)容應(yīng)用于編碼。本章的最后部分會(huì)將3個(gè)結(jié)合在從功能的角度來(lái)區(qū)分,的API可分為兩類(lèi):API的擴(kuò)充API。API由所有SQL和遍歷結(jié)果集。它還包括一些功能函數(shù),用來(lái)完成字符串格式化、操作控制、調(diào)試和錯(cuò)誤處理等任務(wù)。擴(kuò)充API提供不同的方法來(lái)擴(kuò)展,它使你能夠創(chuàng)建自定義的SQL擴(kuò)展,并與本身的SQL增加到88個(gè)函數(shù)。這些函數(shù)包括支持UTF-8和UTF-16編碼的功能函數(shù)。3有一個(gè)更方便的查詢(xún)模式,使查詢(xún)的預(yù)處理更容易并且支持新的參數(shù)綁定方法。3還增加了用戶(hù)定義的排序序列、CHECK約束、64位的鍵值和新的查詢(xún)優(yōu)化。Lock)。甚至,寫(xiě)進(jìn)程通過(guò)把結(jié)果寫(xiě)入臨時(shí)緩沖區(qū)(TemporaryBuffer),可以在得到排它鎖之前就開(kāi)始工作。這對(duì)于寫(xiě)要求較高的應(yīng)用,性能可提高400%。 25–35%并改善了全面性能。B+tree9再是以ASCII形式,這樣,就不必再對(duì)WHERE子句中的值進(jìn)行轉(zhuǎn)換(像第2版那樣)。弱類(lèi)型使你能夠在定義一個(gè)字段時(shí)選擇是否預(yù)類(lèi)型。親和性確定一個(gè)值于字段的格主要的數(shù)據(jù)結(jié)構(gòu)在第1章你看到了很多組件——分詞器、分析器和虛擬機(jī)等等。但是從程序員的角示。這些對(duì)象構(gòu)成了編寫(xiě)優(yōu)秀代碼所必須知道的3個(gè)首要內(nèi)容:API、事務(wù)和鎖。圖5-1CAPI對(duì)象模連接(Connection)和語(yǔ)句連接(Connection)和語(yǔ)句(Statement)SQL命令涉及的兩個(gè)主要數(shù)據(jù)結(jié)構(gòu),幾乎所有通API進(jìn)行的操作都要用到它們。連接代表在一個(gè)獨(dú)立的事務(wù)環(huán)境下的一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)VDBE程序執(zhí)行狀態(tài)所需的資源,指向硬盤(pán)記錄的B-tree游標(biāo),以及參數(shù)等等。B-tree語(yǔ)句最終都是通過(guò)連接的B-treepagerB-tree的游標(biāo)(cursor)任務(wù)。任何時(shí)候,如果B-tree需要頁(yè),它都會(huì)請(qǐng)求pager從磁盤(pán)數(shù)據(jù),pager把頁(yè)加載到頁(yè)緩沖區(qū)(pagecache)。之后,B-tree和與之關(guān)聯(lián)的游標(biāo)就可以位于頁(yè)中的記錄了。如果游標(biāo)改變了頁(yè),為了防止事務(wù)回滾,pager必須采取特殊的方式保存原來(lái)的頁(yè)??偟膩?lái)說(shuō),pager負(fù)責(zé)讀寫(xiě)數(shù)據(jù)庫(kù),管理內(nèi)存緩存和頁(yè),以及管理事務(wù)、鎖和恢復(fù)(這些在“事務(wù)”總之,關(guān)于連接和事務(wù),你必須知道兩件事:()對(duì)數(shù)據(jù)庫(kù)的任何操作,接存在于一個(gè)事務(wù)之下。)接絕不會(huì)同時(shí)存在于多個(gè)事務(wù)之下。無(wú)論何時(shí),接在對(duì)數(shù)據(jù)API連接的生命周期(TheConnection處理事務(wù)(Performtransactions):如你所知,任何命令都在事務(wù)下執(zhí)行。默認(rèn)情況下,事務(wù)自動(dòng)提交,也就是每一個(gè)SQLMIT連接數(shù)據(jù)庫(kù)(Connecttothe連接數(shù)據(jù)庫(kù)不只是打開(kāi)一個(gè)文件。每個(gè)數(shù)據(jù)庫(kù)都在單獨(dú)的操作系統(tǒng)文件中——統(tǒng)調(diào)用,來(lái)打開(kāi)一個(gè)文件,它的實(shí)現(xiàn)位于main.c文件中。RAM中創(chuàng)建。內(nèi)存數(shù)據(jù)庫(kù)將只能被創(chuàng)建它的連接所存取,不能與其它連接共享。另外,會(huì)假定你想創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。在這種情況下,不會(huì)立即在磁盤(pán)上創(chuàng)建一對(duì)象。如果你打開(kāi)一個(gè)數(shù)據(jù)庫(kù),不做任何事,然后關(guān)閉它,會(huì)創(chuàng)建一個(gè)文件,但只是一個(gè)長(zhǎng)度為0的空文件而已。1024512-32768字節(jié)之間為2encodingpragma來(lái)設(shè)置字符編碼,其值可以是UTF-8、UTF-16、UTF-16le(littleendian)UTF-16be(bigendian)。執(zhí)行預(yù)處理查詢(xún)準(zhǔn)備分詞器(tokenizer)、分析器(parser)和代碼(codegenerator)把SQL語(yǔ)句編譯成VDBE結(jié)果集所需的全部資源。相應(yīng)的CAPI為3_prepare(),位于prepare.c文件中。執(zhí)行虛擬機(jī)執(zhí)行字節(jié)碼,執(zhí)行過(guò)程是一個(gè)步進(jìn)(stepwise)的過(guò)程,每一步(step)由3_step()啟種類(lèi)由命令要做什么(讀或?qū)?決定。對(duì)于SELECT語(yǔ)句,每次調(diào)用3_step()使用語(yǔ)句句柄的游標(biāo)移到結(jié)果集的下一行。對(duì)于結(jié)果集中的每一行,它返回_ROW,當(dāng)?shù)竭_(dá)結(jié)果末尾時(shí),返回_DONE。對(duì)于其它SQL語(yǔ)句(INSERT、UPDATE、DELETE等),第一次調(diào)用3_step()就導(dǎo)致VDBE執(zhí)行整個(gè)命令。VDBE關(guān)閉語(yǔ)句,釋放資源。相應(yīng)的CAPI為3_finalize(),它導(dǎo)致VDBE結(jié)束程序運(yùn)則3_finalize()會(huì)返回一個(gè)錯(cuò)誤。當(dāng)3_finalize()執(zhí)行成功,所有與語(yǔ)句對(duì)象關(guān)聯(lián)的和沒(méi)有申請(qǐng)鎖,一直到調(diào)用3_step()時(shí)才會(huì)申請(qǐng)鎖。Active狀態(tài)開(kāi)始于對(duì)3_step()的已經(jīng)被釋放。通過(guò)圖5-2可以更容易地理解該過(guò)程:5-2{int3*db;3_stmt*stmt;char*sql;const}sql="select*from}}}}將3.def和3.dll文件到工作空間所 。(這兩個(gè)文件可 LIB/DEF:3.def不需要執(zhí)行;如果執(zhí)行,可能需要根據(jù)VC的安裝情況有所改動(dòng)。臨時(shí)器是查詢(xún)處理的重要組成部分。有時(shí)需要命令執(zhí)行過(guò)程中產(chǎn)生的中間ORDERBY子句指定需要排序,或進(jìn)行多表交叉查詢(xún)時(shí)。中間結(jié)果存使用參數(shù)化的定”)。下面是帶參數(shù)的SQL示例語(yǔ)句:INSERTINTOfoods(id,name)VALUES(?,?);Positionalparametersaredefinedbythepositionofthequestionmarkinthestatement.Thefirstquestionmarkhasposition1,thesecond2,andsoon.Namedparametersuseactualvariablenames,whichareprefixedwithacolon.When3_prepare()compilesastatementwithparameters,itallocatesceholdersfortheparametersintheresultingstatementhandle.Itthenexpectsvaluestobeprovidedfortheseparametersbe

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論