sql server課件第4章章節(jié)課件_第1頁
sql server課件第4章章節(jié)課件_第2頁
sql server課件第4章章節(jié)課件_第3頁
sql server課件第4章章節(jié)課件_第4頁
sql server課件第4章章節(jié)課件_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章表4.1數(shù)據(jù)表概述4.2數(shù)據(jù)類型4.3創(chuàng)建數(shù)據(jù)表4.4修改數(shù)據(jù)表4.5刪除數(shù)據(jù)表4.6數(shù)據(jù)完整性與約束4.7數(shù)據(jù)庫關(guān)系圖4.8使用數(shù)據(jù)表4.9臨時(shí)表4.10分區(qū)表4.11FileTable4.12圖形數(shù)據(jù)表4.13時(shí)態(tài)數(shù)據(jù)表4.14內(nèi)存優(yōu)化表本章主要介紹以下內(nèi)容:2數(shù)據(jù)庫技術(shù)(Tujianfei@)2018年9月數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)模型數(shù)據(jù)模型主要是指描述記錄內(nèi)數(shù)據(jù)項(xiàng)之間及記錄之間聯(lián)系的數(shù)據(jù)結(jié)構(gòu)形式,是數(shù)據(jù)庫系統(tǒng)用以提供信息表示和操作手段的形式框架。在數(shù)據(jù)庫中用數(shù)據(jù)模型來抽象、表示和處理現(xiàn)實(shí)世界中的數(shù)據(jù)。數(shù)據(jù)庫即是模擬現(xiàn)實(shí)世界中某應(yīng)用環(huán)境(一個(gè)企業(yè)、單位或部門)所涉及的數(shù)據(jù)的集合,它不僅要反映數(shù)據(jù)本身的內(nèi)容,而且要反映數(shù)據(jù)之間的聯(lián)系。層次模型(HierarchicalModel)網(wǎng)狀模型(NetworkModel)關(guān)系模型(RelationalModel)3(1)層次模型把客觀問題抽象為一個(gè)嚴(yán)格的自上而下的層次關(guān)系。特點(diǎn):層次分明、結(jié)構(gòu)清晰,適用于描述主次之分的結(jié)構(gòu)關(guān)系,但只能反映實(shí)體間一對(duì)多的關(guān)系。S1S2S3S4S5S1根結(jié)點(diǎn)父結(jié)點(diǎn)葉結(jié)點(diǎn)關(guān)系層次模型意示圖學(xué)校學(xué)院系學(xué)院系研究所教研室層次模型實(shí)例(1)有且僅有一個(gè)根結(jié)點(diǎn)無父結(jié)點(diǎn)(2)其他結(jié)點(diǎn)有且僅有一個(gè)父結(jié)點(diǎn)。典型的層次數(shù)據(jù)庫系統(tǒng):IBM公司的IMS(InformationManagementSystem)45(2)網(wǎng)狀模型是以記錄為結(jié)點(diǎn)的網(wǎng)絡(luò),反映現(xiàn)實(shí)世界中較為復(fù)雜的事物之間的聯(lián)系。工廠1工廠2工廠3零件1零件2零件3零件4部件1部件1部件1網(wǎng)狀模型的示意圖特點(diǎn):(1)有一個(gè)以上結(jié)點(diǎn)無父結(jié)點(diǎn)(2)至少有一個(gè)結(jié)點(diǎn)有多于一個(gè)的父結(jié)點(diǎn)表達(dá)能力強(qiáng),能夠反映實(shí)體間的復(fù)雜關(guān)系,即能反映實(shí)體之間的縱向關(guān)系,也能反映實(shí)體間的橫向關(guān)系。但對(duì)計(jì)算機(jī)的軟件和硬件環(huán)境要求比較高。IBM公司開發(fā)的IDS(IntegratedDataStore)(3)關(guān)系模型是一張二維的表格,它使用表格來描述實(shí)體間的關(guān)系,結(jié)構(gòu)清晰,容易接受。既能反映屬性間的一對(duì)一、一對(duì)多,多對(duì)多的關(guān)系,也能反映記錄即實(shí)體間的這些關(guān)系。目前,大多數(shù)數(shù)據(jù)庫管理系統(tǒng)都是關(guān)系型的。SQLServer就是一種關(guān)系型的數(shù)據(jù)庫。學(xué)號(hào)姓名系名班名98001張三機(jī)械980198002李四計(jì)算機(jī)980298003王五工商9803關(guān)系模型屬性、字段、域、列記錄7典型的關(guān)系型數(shù)據(jù)庫4.1數(shù)據(jù)表概述

4.1.1關(guān)系型數(shù)據(jù)表

SQLServer是關(guān)系型的數(shù)據(jù)庫管理系統(tǒng)。所謂關(guān)系型數(shù)據(jù)庫是指數(shù)據(jù)庫內(nèi)數(shù)據(jù)的組織模型是關(guān)系模型。關(guān)系模型的特點(diǎn)可以用一張二維表格來描述,表由行和列兩部分組成。在SQLServer2019中,為組織和管理某一項(xiàng)應(yīng)用,在數(shù)據(jù)庫中創(chuàng)建的數(shù)據(jù)表,在表內(nèi)存在列與列、行與行之間的關(guān)系,表間也存在表與表之間對(duì)應(yīng)關(guān)系。這種對(duì)應(yīng)關(guān)系有三種:一對(duì)一、一對(duì)多和多對(duì)多關(guān)系。4.1.2規(guī)范化與范式

規(guī)范化(Normalization)是優(yōu)化數(shù)據(jù)組織方式的過程。規(guī)范化理論研究關(guān)系模型中各屬性之間的依賴關(guān)系及其對(duì)關(guān)系模型性能的影響,探討關(guān)系模型應(yīng)該具備的性質(zhì)和設(shè)計(jì)方法。規(guī)范化理論是E.F.Codd在l971年提出的。他及后來的研究者為數(shù)據(jù)結(jié)構(gòu)定義了五種規(guī)范化模式(NormalForm,簡(jiǎn)稱范式)。范式表示的是關(guān)系模式的規(guī)范化程度,也即滿足某種約束條件的關(guān)系模式,根據(jù)滿足的約束條件的不同來確定范式。這五種范式根據(jù)滿足規(guī)范化要求的不同,分別稱為:第一范式(FirstNormalForm,簡(jiǎn)稱1NF)、第二范式(SecondNormalForm,簡(jiǎn)稱2NF)、第三范式(ThirdNormalForm,簡(jiǎn)稱3NF)、第四范式(FourthNormalForm,簡(jiǎn)稱4NF)和第五范式(FifthNormalForm,簡(jiǎn)稱5NF),這五種范式中前三種在實(shí)際應(yīng)用中使用較多,而后兩種主要用于理論研究。4.1.3ER圖

ER圖是一組用圖形和符號(hào)表示的,用于描述客觀實(shí)體對(duì)象的屬性與關(guān)系的圖形工具。由于ER圖直觀、易用,成為數(shù)據(jù)表的規(guī)劃設(shè)計(jì)的一種常用工具。在ER圖中,包含三種圖形,其中矩形代表實(shí)體、圓角矩形(或橢圓)代表實(shí)體的屬性和菱形代表實(shí)體間的關(guān)系。4.1.4SQLServer2019數(shù)據(jù)表類型

在SQLServer2019中,共有9種類型的數(shù)據(jù)表:系統(tǒng)表、普通表、臨時(shí)表、分區(qū)表、FileTable、時(shí)態(tài)表、內(nèi)存優(yōu)化表、外部表和圖形表。系統(tǒng)表是由SQLServer系統(tǒng)提供的,用于存放系統(tǒng)運(yùn)行信息的數(shù)據(jù)表,例如有關(guān)服務(wù)器配置、數(shù)據(jù)庫選項(xiàng)等信息都保存在系統(tǒng)表中。普通表,也即用戶表,是由用戶創(chuàng)建的,用于存儲(chǔ)用戶數(shù)據(jù)的數(shù)據(jù)表。普通表是用戶使用SQLServer存儲(chǔ)和管理數(shù)據(jù)的對(duì)象,用戶數(shù)據(jù)保存在普通表中。臨時(shí)表,是因用戶、應(yīng)用程序或者系統(tǒng)運(yùn)行需要臨時(shí)創(chuàng)建的數(shù)據(jù)表。該數(shù)據(jù)表只能臨時(shí)保存在臨時(shí)數(shù)據(jù)庫tempdb中,當(dāng)用戶斷開連接或者SQLServer服務(wù)重啟或停止時(shí),臨時(shí)表會(huì)丟失。臨時(shí)表根據(jù)用戶使用權(quán)限的不同,可以劃分成為兩大類:全局臨時(shí)表和本地臨時(shí)表。全局臨時(shí)表在創(chuàng)建之后,所有用戶和連接都可訪問;本地臨時(shí)表,只能供創(chuàng)建它的用戶或連接訪問。分區(qū)表,是一種特殊的數(shù)據(jù)表,用于將大型數(shù)據(jù)表分割成多個(gè)較小數(shù)據(jù)表,以提高數(shù)據(jù)管理性能的場(chǎng)合FileTable,是一種用于保存非結(jié)構(gòu)化數(shù)據(jù)的用戶表,如Word文檔、Excle電子數(shù)據(jù)表格等文件都可以通過FileTable進(jìn)行管理。4.1.4SQLServer2019數(shù)據(jù)表類型

時(shí)態(tài)表,是一種用于記錄用戶數(shù)據(jù)變化歷史的數(shù)據(jù)表,即通過時(shí)態(tài)表系統(tǒng)可以記錄用戶對(duì)表中數(shù)據(jù)更新修改的情況。因此,時(shí)態(tài)表也被稱為系統(tǒng)版本控制表。內(nèi)存優(yōu)化表,是一種將表存儲(chǔ)于內(nèi)存中,通過內(nèi)存的高性能讀寫速度來提升數(shù)據(jù)讀寫速度。與普通存儲(chǔ)在磁盤中的表相比,存放于內(nèi)存中的內(nèi)存優(yōu)化表,同樣支持完全事務(wù)性和持久化,支持T-SQL語句。且部分不需要持久化的數(shù)據(jù),即不需要寫入硬盤保存的數(shù)據(jù),采用內(nèi)存優(yōu)先表可以獲得更好的性能。外部表,是SQLServer用于實(shí)現(xiàn)數(shù)據(jù)虛擬化的重要工具。數(shù)據(jù)虛擬化是指不論數(shù)據(jù)以何種格式存放于何處,都能統(tǒng)一進(jìn)行管理和訪問。SQLServer可以使用PolyBase配置遠(yuǎn)端數(shù)據(jù)源中,SQLServer外部表支持Hadoop、AzureBlobStorage、SQLServer、Oracle、Teradata、MongoDB和ODBC等各種類型的數(shù)據(jù)源。圖形表,是SQLServer用于反映實(shí)體間關(guān)系的數(shù)據(jù)表,如學(xué)生與課程之間是否選修與未選修的關(guān)系。通過圖形表存儲(chǔ)和處理實(shí)體關(guān)系,比采用普通表有更高的效率和處理性能。4.2數(shù)據(jù)類型

在SQLServer2019中提供的系統(tǒng)內(nèi)置數(shù)據(jù)類型,可以分為:數(shù)值型數(shù)據(jù)類型、字符型數(shù)據(jù)類型、日期型數(shù)據(jù)類型、貨幣型數(shù)據(jù)類型、二進(jìn)制型數(shù)據(jù)類型、程序用數(shù)據(jù)類型和其他數(shù)據(jù)類型七大類。1.字符數(shù)據(jù)類型

字符數(shù)據(jù)類型可以用來存儲(chǔ)各種字母、數(shù)字符號(hào)和特殊符號(hào)。

Char:其定義形式為char(n),每個(gè)字符和符號(hào)占用一個(gè)字節(jié)的存儲(chǔ)空間。

Varchar:其定義形式為varchar(n)。用varchar數(shù)據(jù)類型可以存儲(chǔ)長達(dá)8K個(gè)字符的可變長度字符串。

Nchar:其定義形式為nchar(n)。

Nvarchar:其定義形式為nvarchar(n)。varchar(max):用max標(biāo)注列的長度,表示該列可以存儲(chǔ)長度超過8000的字符,最大存儲(chǔ)空間達(dá)231-1(1073741832)個(gè)字符。nvarchar(max):與nvarchar(n)類似,但長度可超過4000個(gè)字符,最大可達(dá)231-1(1073741832)個(gè)字符。2.整型數(shù)據(jù)類型整型數(shù)據(jù)類型是最常用的數(shù)據(jù)類型之一,它主要用來存儲(chǔ)整數(shù)值,可以直接進(jìn)行數(shù)據(jù)運(yùn)算。

int(integer):int(或integer)數(shù)據(jù)類型可以存儲(chǔ)從-231(-2147483648)到231-1(2147483647)范圍之間的所有正負(fù)整數(shù)(4個(gè)字節(jié))。

Smallint:可以存儲(chǔ)從-215(-32768)到215-1(32768)范圍之間的所有正負(fù)整數(shù)(2個(gè)字節(jié))。

Tinyint:可以存儲(chǔ)從0到255范圍之間的所有正整數(shù)(1個(gè)字節(jié))。

Bigint:與int相類似,但存儲(chǔ)的范圍更大,存儲(chǔ)范圍在-263(-9223372036854775808)至263(9223372036854775807)之間,占用8個(gè)字節(jié)的存儲(chǔ)空間。適用于存儲(chǔ)長度超過int范圍的整型數(shù)據(jù)。3.浮點(diǎn)數(shù)據(jù)類型浮點(diǎn)數(shù)據(jù)類型用于存儲(chǔ)十進(jìn)制小數(shù)。

Real:可以存儲(chǔ)正的或者負(fù)的十進(jìn)制數(shù)值,最大可以有7位精確位數(shù)。

Float:可以精確到第15位小數(shù),其范圍從-1.79E-308到1.79E+308。

Decimal和numeric:Decimal數(shù)據(jù)類型和numeric數(shù)據(jù)類型完全相同,它們可以提供小數(shù)所需要的實(shí)際存儲(chǔ)空間,但也有一定的限制,可以用2到17個(gè)字節(jié)來存儲(chǔ)從-1038-1到1038-1之間的數(shù)值。4.日期和時(shí)間數(shù)據(jù)類型Date:用于存儲(chǔ)日期的數(shù)據(jù)類型,其范圍從0001年1月1日至9999年12月31日,需占用10個(gè)字節(jié)的存儲(chǔ)空間。數(shù)據(jù)格式為YYYY-MM-DD,不包含具體的時(shí)間。

Datetime:用于存儲(chǔ)日期和時(shí)間的結(jié)合體。它可以存儲(chǔ)從公元1753年1月1日零時(shí)起到公元9999年12月31日23時(shí)59分59秒之間的所有日期和時(shí)間。Smalldatetime:與datetime數(shù)據(jù)類型類似,但其日期時(shí)間范圍較小,它存儲(chǔ)從1900年1月1日到2079年6月6日內(nèi)的日期。datetime2(n):與datetime相類似,不同之處是datetime2秒的小數(shù)部分精度更高,存儲(chǔ)范圍更大為:0001年1月1日至9999年12月31日,秒數(shù)可以精確到小數(shù)點(diǎn)后7位4.日期和時(shí)間數(shù)據(jù)類型

datetimeoffset(n):用于存儲(chǔ)與日期和時(shí)區(qū)相關(guān)的日期、時(shí)間數(shù)據(jù)。存儲(chǔ)的日期時(shí)間數(shù)據(jù),需要轉(zhuǎn)化成為UTC(CoordinatedUniversalTime)值的時(shí)間,即需要根據(jù)時(shí)區(qū)關(guān)系進(jìn)行換算。如要存儲(chǔ)北京時(shí)間2010-01-0110:00:00需換算存儲(chǔ)為2010-01-0118:00:00,該類型的格式為YYYY-MM-DDhh:mm:ss[.nnnnnnn][+|_]hh:mm。占用的存儲(chǔ)空間也會(huì)因n的取值不同而不同,在26至34個(gè)字節(jié)之間。

time(n):是一種專用于存儲(chǔ)時(shí)間的數(shù)據(jù)類型,與datetime相比不同之處在于沒有日期值。格式為hh:mm:ss[.nnnnnnn],占用的存儲(chǔ)空間因n的不同,范圍為3至5個(gè)字節(jié)。5.貨幣數(shù)據(jù)類型

Money:用于存儲(chǔ)貨幣值,存儲(chǔ)在money數(shù)據(jù)類型中的數(shù)值以一個(gè)正數(shù)部分和一個(gè)小數(shù)部分存儲(chǔ)在兩個(gè)4字節(jié)的整型值中,存儲(chǔ)范圍為-922337213685477.5808到922337213685477.5808,精度為貨幣單位的萬分之一。

Smallmoney:與money數(shù)據(jù)類型類似,但其存儲(chǔ)的貨幣值范圍比money數(shù)據(jù)類型小,其存儲(chǔ)范圍為-214748.3468到214748.3467。6.文本和圖形數(shù)據(jù)類型

Text:用于存儲(chǔ)大量文本數(shù)據(jù),其容量理論上為1到231-1(2147483647)個(gè)字節(jié),但實(shí)際應(yīng)用時(shí)要根據(jù)硬盤的存儲(chǔ)空間而定,如:超過8K的大字符串,如HTML文檔的全部內(nèi)容。

Ntext:與text數(shù)據(jù)類型類似,存儲(chǔ)在其中的數(shù)據(jù)通常是直接能輸出到顯示設(shè)備上的字符,顯示設(shè)備可以是顯示器、窗口或者打印機(jī)。(Unicode字符)

Image:用于存儲(chǔ)照片、目錄圖片或者圖畫,其理論容量為231-1(2147483647)個(gè)字節(jié)。image數(shù)據(jù)列可以用來存儲(chǔ)超過8KB的可變長度的二進(jìn)制數(shù)據(jù),如MicrosoftWord文檔、MicrosoftExcel電子表格、包含位圖的圖像、圖形交換格式(GIF)文件和聯(lián)合圖像專家組(JPEG)文件。

7.二進(jìn)制數(shù)據(jù)類型

Binary:其定義形式為binary(n),數(shù)據(jù)的存儲(chǔ)長度是固定的,即n+4字節(jié),當(dāng)輸入的二進(jìn)制數(shù)據(jù)長度小于n時(shí),余下部分填充0。

Varbinary:其定義形式為varbinary(n),數(shù)據(jù)的存儲(chǔ)長度是變化的,它為實(shí)際所輸入數(shù)據(jù)的長度加上4字節(jié)。其它含義同binary。

varbinary(max):與varbinary相似,只是最大存儲(chǔ)長度可以超過8000字節(jié),達(dá)231-1(1073741832),適合代替image類型來存儲(chǔ)圖像、Word文檔、應(yīng)用程序等二進(jìn)制型數(shù)據(jù)。8.位數(shù)據(jù)類型

Bit:稱為位數(shù)據(jù)類型,其數(shù)據(jù)有兩種取值:0和1,長度為1字節(jié)。一般用于保存用來表示邏輯值的數(shù)據(jù).如,是否會(huì)員,是否是新消息等.9.程序用數(shù)據(jù)類型hierarchyid:SQLServer2019新增的一種用于存儲(chǔ)層次化結(jié)構(gòu)型數(shù)據(jù)的數(shù)據(jù)類型。對(duì)于商品目錄、組織機(jī)構(gòu)等具有層次化結(jié)構(gòu)的數(shù)據(jù),采用hierarchyid來存儲(chǔ),可以利用hierarchyid提供的函數(shù),非常方便地實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和節(jié)點(diǎn)搜索。geometry:一種用于存儲(chǔ)平面幾何對(duì)象(平面球)的數(shù)據(jù)類型,如點(diǎn)、多邊形、曲線等11種幾何度量中的一種。Geography:用于存儲(chǔ)GPS等全球定位類型的地理數(shù)據(jù)(橢圓球),以緯度和經(jīng)度為度量來存儲(chǔ)。9.程序用數(shù)據(jù)類型XML:用于存放整個(gè)XML文檔或者部分片段。Cursor:這是一種變量或存儲(chǔ)過程的輸出參數(shù)使用的數(shù)據(jù)類型,也稱為游標(biāo)。Cursor提供了一種逐行處理查詢數(shù)據(jù)的功能。用cursor定義的變量只能用于定義游標(biāo)和與游標(biāo)有關(guān)的語句,不能在表設(shè)計(jì)時(shí)使用。Table:用于存儲(chǔ)對(duì)表或者視圖處理后的結(jié)果集的數(shù)據(jù)類型。這種數(shù)據(jù)類型使得變量可以存儲(chǔ)一個(gè)表,從而使函數(shù)或過程返回查詢結(jié)果更加方便、快捷。sql_variant:是一種允許存儲(chǔ)多個(gè)不同類型數(shù)據(jù)值的數(shù)據(jù)類型,除了varchar(max)、nvarchar(max)、text、image、sql_variant、sql_variant(max)、xml、ntext、rowversion等之外的數(shù)據(jù)類型都可以存儲(chǔ)。10.其他數(shù)據(jù)類型

rowversion:用于存儲(chǔ)由SQLServer產(chǎn)生的可標(biāo)注數(shù)據(jù)行唯一性的二進(jìn)制數(shù)據(jù)。每次行數(shù)據(jù)發(fā)生變化時(shí),該值也會(huì)發(fā)生變化,用于反映修改的記錄。在早先的版本中該數(shù)據(jù)類型對(duì)應(yīng)的是timestamp。

Uniqueidentifier:用于存儲(chǔ)一個(gè)16字節(jié)長的二進(jìn)制數(shù)據(jù)類型,它是SQLServer根據(jù)計(jì)算機(jī)網(wǎng)絡(luò)適配器地址和CPU時(shí)鐘產(chǎn)生的唯一號(hào)碼而生成的全局唯一標(biāo)識(shí)符代碼(GloballyUniqueIdentifier,簡(jiǎn)寫為GUID)。4.2.2用戶自定義數(shù)據(jù)類型

在SQLServerManagementStudio創(chuàng)建用戶自定義數(shù)據(jù)類型的操作步驟如下:1、在“對(duì)象資源管理器”窗口,選擇“數(shù)據(jù)庫”→“NetSale”→“可編程性”→“用戶自定義數(shù)據(jù)類型”。2、在如圖4-8所示的“用戶自定義數(shù)據(jù)類型”對(duì)話框中,“名稱”項(xiàng)輸入“PostCode”,“數(shù)據(jù)類型”選擇“varchar”,指定長度為“6”,選中“允許NULL值”,表示允許使用此數(shù)據(jù)類型定義的列可以不輸入數(shù)據(jù)。3、單擊“確定”,保存自定義的數(shù)據(jù)類型。這樣在“用戶自定義數(shù)據(jù)類型”節(jié)點(diǎn)下,可以看到新創(chuàng)建的數(shù)據(jù)類型,在當(dāng)前數(shù)據(jù)庫中,可以像使用系統(tǒng)數(shù)據(jù)類型一樣使用。4.2.2用戶自定義數(shù)據(jù)類型創(chuàng)建用戶自定義數(shù)據(jù)類型的TSQL語句需要調(diào)用系統(tǒng)存儲(chǔ)過程sp_addtype,其語法如下:sp_addtype[@typename=]type,[@phystype=]system_data_type

[,[@nulltype=]'null_type'];各參數(shù)所代表的含義如下:@typename,自定義的數(shù)據(jù)類型的名稱,在數(shù)據(jù)庫中不能與已有數(shù)據(jù)類型名稱重復(fù)。@phystype,現(xiàn)有的系統(tǒng)數(shù)據(jù)類型,用于作為自定義數(shù)據(jù)類型的基礎(chǔ)。@nulltype,是否允許該數(shù)據(jù)類型保存NULL值。Execsp_addtypeaddress,‘varchar(80)’,‘notnull’4.3創(chuàng)建數(shù)據(jù)表

4.3.1使用SSMS創(chuàng)建數(shù)據(jù)表

DEMO4.3創(chuàng)建數(shù)據(jù)表4.3.2使用TSQL創(chuàng)建數(shù)據(jù)表

在SQLServer2019中創(chuàng)建數(shù)據(jù)表的TSQL語句是CREATETABLE,基本語法如下:CREATETABLE[database_name.[schema_name].|schema_name.]table_name

({<column_definition>|<computed_column_definition>|<column_set_definition>}[<table_constraint>][,...n])[ON{partition_scheme_name(partition_column_name)|filegroup

|"default"}]4.3.2使用TSQL創(chuàng)建數(shù)據(jù)表CREATETABLE[dbo].訂單表(

orderID

intIDENTITY(1,1)NOTNULL,

ordertime

datetimeNULLDEFAULTGetdate(),

customerID

intNOTNULL, StatusbitNOTNULLDEFAULT(0),

shiptime

datetimeNULL)各主要參數(shù)的含義如下:database_name,新的數(shù)據(jù)表所屬性的數(shù)據(jù)庫名稱。schema_name,架構(gòu)名稱,關(guān)于架構(gòu)請(qǐng)參見相關(guān)章節(jié)。table_name,數(shù)據(jù)表的名稱。column_definition,各數(shù)據(jù)列的定義。computed_column_definition,定義計(jì)算列4.4修改數(shù)據(jù)表

1、在“對(duì)象資源管理器”窗口中,展開服務(wù)器、數(shù)據(jù)庫節(jié)點(diǎn),找到要修改的數(shù)據(jù)表。2、右擊要修改的數(shù)據(jù)表,在右鍵菜單中選擇“設(shè)計(jì)”。3、在打開的“表設(shè)計(jì)器”窗口中,可以對(duì)列名、數(shù)據(jù)類型等進(jìn)行修改。4、如要添加新的列,可以單擊列列表底部的空白行,輸入新的列名、數(shù)據(jù)類型,設(shè)置是否允許為NULL等。5、修改完畢后,可以單擊工具欄的“保存”按鈕,保存修改后的數(shù)據(jù)表。4.4.1使用SSMS修改數(shù)據(jù)表

4.4修改數(shù)據(jù)表

1、使用TSQL添加新列添加新列使用的TSQL語句為ALTERTABLE,基本語法如下:ALTERTABLEtable_nameADDColumn_name[Default<value>][NOTNULL][IDENTITY][UNIQUE]各參數(shù)含義如下:table_name,待修改的數(shù)據(jù)表的名稱。Column_name,添加的新列的名稱。Default<value>,默認(rèn)值,可選項(xiàng)。NOTNULL,是否允許為空。IDENTITY,是否作為標(biāo)識(shí)列,一個(gè)表中只能有一個(gè)標(biāo)識(shí)列。UNIQUE,是否創(chuàng)建唯一約束。4.4.2使用TSQL修改數(shù)據(jù)表4.4修改數(shù)據(jù)表

4.4.2使用TSQL修改數(shù)據(jù)表例如,要在“客戶數(shù)據(jù)表(Customers)”中添加一個(gè)新列:CustomerType,數(shù)據(jù)類型為varchar(20),默認(rèn)值為“個(gè)人客戶”,則修改表的語句如下:ALTERTABLE客戶數(shù)據(jù)表ADDCustomerType

varchar(20)NOTNULLDefault('個(gè)人用戶')1、使用TSQL添加新列4.4修改數(shù)據(jù)表SQLServer2019允許修改現(xiàn)有列的數(shù)據(jù)類型、數(shù)據(jù)長度和默認(rèn)值等,修改現(xiàn)有列的語法如下:ALTERTABLEtable_nameALTERColumnColumn_name

new_data_type各參數(shù)含義如下:table_name,待修改的數(shù)據(jù)表的名稱。Column_name,修改的列的名稱。new_data_type,列的新數(shù)據(jù)類型。ALTERTABLE客戶數(shù)據(jù)表ALTERColumnShipAddress

varchar(200)例如,要將“客戶數(shù)據(jù)表(Customers)”中的ShipAddress的數(shù)據(jù)類型修改為varchar(200)2、使用TSQL修改現(xiàn)有列4.4修改數(shù)據(jù)表刪除現(xiàn)有列的語句如下:ALTERTABLEtable_nameDROPColumnColumn_name[,...n]各參數(shù)含義如下:table_name,待修改的數(shù)據(jù)表的名稱。Column_name,待刪除的列的名稱。例如,要“訂單細(xì)節(jié)表(Orderdetail)”中刪除“SunTotal”列,則語句如下:ALTERTABLE訂單細(xì)節(jié)表DROPColumnSunTotal3、使用TSQL刪除現(xiàn)有列4.4修改數(shù)據(jù)表4、關(guān)于計(jì)算列計(jì)算列在數(shù)據(jù)表中是一種特殊的列,它不需要指定數(shù)據(jù)類型,其值來源于其他列的表達(dá)式計(jì)算,這些表達(dá)式可以是函數(shù)、常量或表中的其它列。默認(rèn)情況下,計(jì)算列并不會(huì)將數(shù)據(jù)值實(shí)際存儲(chǔ)在數(shù)據(jù)表中,只是在需要時(shí),如通過查詢語句獲取時(shí),才會(huì)重新計(jì)算表達(dá)式來獲取值。因此,計(jì)算列可算是一種虛擬的列。計(jì)算列可以在表創(chuàng)建時(shí),與參與表達(dá)式的其他列一起定義;也可以通過添加新列時(shí)添加進(jìn)來。例如,以下語句可以為“訂單細(xì)節(jié)表(Orderdetail)”新增一個(gè)名稱為“SunTotal”的計(jì)算列,其數(shù)值取自列“Sale_unitprice”與“sales”的乘積。ALTERTABLE訂單細(xì)節(jié)表ADDSubTotalAsSale_unitprice*sales4.5刪除數(shù)據(jù)表

1、在SQLServerManagementStudio中,展開“對(duì)象資源管理器”的服務(wù)器、數(shù)據(jù)庫節(jié)點(diǎn),在數(shù)據(jù)庫節(jié)點(diǎn)中展開“表”節(jié)點(diǎn)。2、選中要?jiǎng)h除的數(shù)據(jù)表,右擊該數(shù)據(jù)表,然后在右鍵菜單中選擇“刪除”。3、在“要?jiǎng)h除的對(duì)象”列表中可以查看待刪除數(shù)據(jù)表的信息,如果當(dāng)前其他程序正在使用該數(shù)據(jù)表,則可以在“消息”列中查看到相關(guān)的信息。單擊“確定”,可以完成對(duì)數(shù)據(jù)表的刪除。4.5.1使用SSMS刪除數(shù)據(jù)表4.5刪除數(shù)據(jù)表刪除數(shù)據(jù)表的TSQL語句是DROPTABLE,語法規(guī)則相當(dāng)簡(jiǎn)單,如下所示:DROPTABLEtable_name[,...n]如要?jiǎng)h除一個(gè)數(shù)據(jù)表,可以執(zhí)行以下代碼:DROPTABLE客戶數(shù)據(jù)表如果要一次刪除多個(gè)數(shù)據(jù)表,可以執(zhí)行如下代碼:DROPTABLE客戶數(shù)據(jù)表,訂單細(xì)節(jié)表4.5.2使用TSQL刪除數(shù)據(jù)表4.6數(shù)據(jù)完整性與約束

數(shù)據(jù)完整性是為了防止在數(shù)據(jù)庫出現(xiàn)不符合語義規(guī)則的數(shù)據(jù)和防止因錯(cuò)誤數(shù)據(jù)的輸入導(dǎo)致的無效操作和錯(cuò)誤的,提出的規(guī)范要求。其主要含義是指數(shù)據(jù)的精確性(Accuracy)和可靠性(Reliability)。在數(shù)據(jù)庫中,數(shù)據(jù)完整性主要包含四方面:實(shí)體完整性(EntityIntegrity)、域完整性(DomainIntegrity)、參照完整性(ReferentialIntegrity)和用戶定義完整性(User-definedIntegrity)。4.6.1數(shù)據(jù)完整性4.6.1數(shù)據(jù)完整性1、實(shí)體完整性數(shù)據(jù)庫中存放的是實(shí)體的信息,這些實(shí)體可以是各種實(shí)物(如:產(chǎn)品)、也可以概念性(如:公司、客戶),甚至可以是各種事件,如交易訂單等。數(shù)據(jù)庫的實(shí)體完整性是要求數(shù)據(jù)庫中存放的每個(gè)實(shí)體必須能夠被唯一地標(biāo)識(shí)。在數(shù)據(jù)庫中用于解決實(shí)體完整性的主要方法是在數(shù)據(jù)表中設(shè)置表的主關(guān)鍵詞,要求主關(guān)鍵詞在數(shù)據(jù)輸入過程中不會(huì)出現(xiàn)重復(fù)。這樣的主關(guān)鍵詞可以劃分為:簡(jiǎn)單主關(guān)鍵詞和復(fù)合主關(guān)鍵詞。在SQLServer2019中,與主關(guān)鍵詞對(duì)應(yīng)的,用于保證實(shí)體完整性的主要工具是:主鍵、標(biāo)識(shí)和唯一性約束等。4.6.1數(shù)據(jù)完整性2、域完整性域完整性用于確保表中每列的數(shù)據(jù)符合要求,如對(duì)單價(jià)要求輸入的數(shù)據(jù)是數(shù)值型,以便用于計(jì)算。同時(shí)域完整性也要求表中的部分列是必須輸入的,如產(chǎn)品名稱是不能為空的,否則就無法了解究竟是何種產(chǎn)品的數(shù)據(jù)。因此,域完整性可以理解為是一組用于約束列數(shù)據(jù)特性的規(guī)則。在SQLServer2019中,用于確保域完整性的主要工具有:數(shù)據(jù)類型。用于明確區(qū)分不同列只能輸入和保存對(duì)應(yīng)數(shù)據(jù)類型的數(shù)據(jù)。如文本數(shù)據(jù)是不允許保存到數(shù)值型的列中。是否允許輸入NULL值。用于確保必須輸入的列不會(huì)出現(xiàn)空值。約束。包括默認(rèn)值約束、檢查約束、外鍵約束等,默認(rèn)值約束用于在用戶不輸入數(shù)據(jù)時(shí),由系統(tǒng)自動(dòng)填入事先設(shè)定的值,作為該列的值。檢查約束用于驗(yàn)證輸入的數(shù)據(jù)是否是列所要求的,如“性別”列,不允許輸入除“男”、“女”之外的其他數(shù)據(jù)。外鍵約束,通過與其他數(shù)據(jù)表之間的關(guān)系來避免錯(cuò)誤數(shù)據(jù)的輸入。4.6.1數(shù)據(jù)完整性3、參照完整性參照完整性,也稱為引用完整性,主要應(yīng)用于某些數(shù)據(jù)表的完整性需要通過另一個(gè)數(shù)據(jù)表來檢驗(yàn)的場(chǎng)合。參照完整性確保了數(shù)據(jù)表之間的關(guān)系,這種關(guān)聯(lián)關(guān)系在用戶對(duì)相關(guān)數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行新增、刪除或者修改時(shí),都要求滿足。參照性完整性對(duì)避免在應(yīng)用系統(tǒng)中輸入無法對(duì)應(yīng)數(shù)據(jù)有很大的作用。如,在“訂單細(xì)節(jié)表”中出現(xiàn)了一項(xiàng)在“產(chǎn)品數(shù)據(jù)表”無法查到的“ProductID”值,就會(huì)造成系統(tǒng)出錯(cuò),通過約束表間的參照完整性可以避免這種錯(cuò)誤。在SQLServer2019中,參照完整性可以通過外鍵約束、檢查約束、觸發(fā)器和存儲(chǔ)過程等工具來實(shí)現(xiàn)4.6.1數(shù)據(jù)完整性4、用戶定義完整性用戶定義完整性,可應(yīng)用于上述三種數(shù)據(jù)完整性不能夠或較難使用的場(chǎng)合。如在一些商品銷售應(yīng)用系統(tǒng)中,需要確保在生成銷售訂單時(shí),必須要求所銷售的產(chǎn)品在庫存中滿足一定的數(shù)量;外派售后服務(wù)人員時(shí),要求所派售后服務(wù)人員達(dá)到一定的服務(wù)指標(biāo)等。這些應(yīng)用或者更復(fù)雜一些的應(yīng)用,很難通過數(shù)據(jù)庫本身的工具來實(shí)現(xiàn),有些就需要通過在應(yīng)用程序系統(tǒng)中來實(shí)現(xiàn)。這也就是所謂的業(yè)務(wù)邏輯規(guī)則的組成部分。應(yīng)用用戶定義完整性,用戶可以使用數(shù)據(jù)庫的代碼和程序設(shè)計(jì)代碼,通過存儲(chǔ)過程、觸發(fā)器、應(yīng)用程序模塊等來確保數(shù)據(jù)完整性。4.6.2創(chuàng)建約束

1、主鍵約束主鍵約束(PRIMARYKEY),是指通過對(duì)數(shù)據(jù)表設(shè)置主鍵列,以確保表中的行數(shù)據(jù)能夠通過主鍵進(jìn)行區(qū)分,避免出現(xiàn)數(shù)據(jù)重復(fù)的一種約束。2、NOTNULL約束和默認(rèn)值約束NOTNULL約束用于確保必須輸入的列不會(huì)出現(xiàn)為NULL的情況。默認(rèn)值約束是指如果用戶未在不允許為空的列中輸入數(shù)據(jù)時(shí),由系統(tǒng)自動(dòng)把預(yù)設(shè)的默認(rèn)值填入列中。NOTNULL約束和默認(rèn)值約束是實(shí)現(xiàn)域完整性的方法之一。3、UNIQUE約束UNIQUE約束,即唯一性約束,是用于確保表中該列值的數(shù)據(jù)具有唯一性。因此,與主鍵約束相類似,UNIQUE約束也可以實(shí)現(xiàn)表中數(shù)據(jù)的唯一性,唯一性約束也可以建在單一列和復(fù)合列上。4.6.2創(chuàng)建約束

4、檢查約束檢查約束是指通過對(duì)列設(shè)定合理的表達(dá)式,由系統(tǒng)通過對(duì)列中內(nèi)容與表達(dá)式的運(yùn)算,來判斷輸入的數(shù)據(jù)是否符合要求。如“客戶數(shù)據(jù)表”中的“PostCode”列,根據(jù)國內(nèi)對(duì)郵編設(shè)置的特點(diǎn),要求只能輸入6個(gè)0-9的數(shù)字。5、外鍵約束外鍵約束可以實(shí)現(xiàn)前文所述的關(guān)系型數(shù)據(jù)庫表與表之間的關(guān)聯(lián)關(guān)系。另外,通過在表間建立外鍵約束也可以實(shí)現(xiàn)參照完整性。如本章所建的數(shù)據(jù)表“訂單表”中輸入“CustomerID”列的值時(shí),必須是已經(jīng)存在于“客戶數(shù)據(jù)表”中的值,否則就會(huì)出現(xiàn)有訂單但無法確定客戶的不合理情況。4.6.3修改和刪除約束

1、SQLServerManagementStudio中修改和刪除約束1、在SQLServerManagementStudio的“對(duì)象資源管理器”窗口中,展開服務(wù)器、數(shù)據(jù)庫,表節(jié)點(diǎn),右擊要修改的數(shù)據(jù)表,在右鍵菜單中選擇“設(shè)計(jì)”。2、在“表設(shè)計(jì)器”窗口中,通過選擇“表設(shè)計(jì)器”工具欄的按鈕,或者右擊“表設(shè)計(jì)器”的空白區(qū)域,在右鍵菜單中選擇要相應(yīng)的操作項(xiàng)進(jìn)行操作。4.6.4禁用約束禁用約束主要包含兩種情況:一是對(duì)現(xiàn)有數(shù)據(jù)禁用約束,另一種情況是關(guān)閉約束。1、對(duì)現(xiàn)有數(shù)據(jù)禁用約束對(duì)現(xiàn)有數(shù)據(jù)禁用約束,會(huì)禁止約束對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行檢查。但在今后這些未檢查的數(shù)據(jù)發(fā)生更新時(shí),這些被禁止檢查現(xiàn)有數(shù)據(jù)的約束,會(huì)對(duì)發(fā)生更改的數(shù)據(jù)執(zhí)行檢查。4.6.4禁用約束2、關(guān)閉和啟用約束對(duì)于暫時(shí)需要停用的約束,如需要向現(xiàn)有數(shù)據(jù)表導(dǎo)入大量數(shù)據(jù),而這些數(shù)據(jù)可能存在不符合現(xiàn)有外鍵約束和檢查約束的要求。這時(shí)可以先關(guān)閉約束,在完成數(shù)據(jù)導(dǎo)入后,通過對(duì)不符合約束條件的數(shù)據(jù)進(jìn)行修改后,再啟用約束。關(guān)閉約束,可以使用NOCHECK選項(xiàng)來實(shí)現(xiàn),啟用約束可以使用CHECK選項(xiàng)來實(shí)現(xiàn)。如下例中對(duì)“用戶”表中的“CK_gender”進(jìn)行了關(guān)閉又啟用的操作。ALTERTABLEdbo.用戶NOCHECKCONSTRAINTCK_gender--關(guān)閉約束CK_genderGOALTERTABLEdbo.用戶CHECKCONSTRAINTCK_gender--啟用約束CK_genderGO4.7數(shù)據(jù)庫關(guān)系圖

SQLServer的數(shù)據(jù)庫關(guān)系圖提供了一個(gè)直觀的圖形化的工具,可以有效地提高管理員管理數(shù)據(jù)庫內(nèi)各種對(duì)象及對(duì)象之間關(guān)系的效率。4.8使用數(shù)據(jù)表

創(chuàng)建完成后的數(shù)據(jù)表可以用來保存用戶數(shù)據(jù),也可以編輯和修改數(shù)據(jù)。這些用戶數(shù)據(jù)在數(shù)據(jù)表中可以長期存在,除非人為刪除或者出現(xiàn)系統(tǒng)故障,造成數(shù)據(jù)丟失。1、輸入數(shù)據(jù)2、編輯數(shù)據(jù)3、刪除數(shù)據(jù)4.9臨時(shí)表

臨時(shí)表是一種特殊的數(shù)據(jù)表。與普通表不同,臨時(shí)表只能臨時(shí)存在,在創(chuàng)建臨時(shí)表的用戶斷開連接或者SQLServer服務(wù)停止、重啟后就會(huì)丟失。另外,臨時(shí)表統(tǒng)一存放在系統(tǒng)數(shù)據(jù)庫tempdb,也與普通表一般存放在特定的用戶數(shù)據(jù)庫中不同。因此,臨時(shí)表一般用于存放一些臨時(shí)性的數(shù)據(jù)。比如,有些數(shù)據(jù)需要聯(lián)接多個(gè)數(shù)據(jù)表,并且在應(yīng)用程序中需要多次使用時(shí),那么這些數(shù)據(jù)可以保存為臨時(shí)表,用戶訪問臨時(shí)表即可獲取需要的數(shù)據(jù)。從而,可以避免多次重復(fù)地生成相同數(shù)據(jù),增加服務(wù)器負(fù)荷。臨時(shí)表根據(jù)使用范圍的不同,可以分為局部臨時(shí)表和全局臨時(shí)表。局部臨時(shí)表只能供創(chuàng)建者使用,全局臨時(shí)表可在生命周期內(nèi)供所有連接使用。4.9.1創(chuàng)建臨時(shí)表

臨時(shí)表只能通過TSQL語句來創(chuàng)建,無法在SQLServerManagementStudio中新建。創(chuàng)建臨時(shí)表的語句與普通表的創(chuàng)建基本相同,唯一不同是數(shù)據(jù)表名稱前要添加“#”。一個(gè)“#”表示創(chuàng)建的是局部臨時(shí)表,“##”表示創(chuàng)建的是全局臨時(shí)表。以下代碼創(chuàng)建了一個(gè)名稱為“#訂單細(xì)節(jié)表”臨時(shí)表,無論該段代碼在哪個(gè)“數(shù)據(jù)庫”上執(zhí)行,所創(chuàng)建的臨時(shí)表都保存在tempdb數(shù)據(jù)庫中。CREATETABLE[dbo].#訂單細(xì)節(jié)表(

DetailID

intPRIMARYKEYIDENTITY(1,1)NOTNULL,

orderid

intNOTNULL,

productid

intNOTNULL,

Sale_unitpricedecimal(10,2)NOTNULL)4.9.2使用臨時(shí)表

臨時(shí)表也無法在SQLServerManagementStudio中打開和查看,要在臨時(shí)表中輸入數(shù)據(jù)可以采用TSQL語句來實(shí)現(xiàn)。如要在局部臨時(shí)表輸入數(shù)據(jù)可以采用以下代碼:insertinto#訂單細(xì)節(jié)表(orderid,productid,Sale_unitprice)values(1,1,1.1)使用分區(qū)表的主要目的,是為了改善大型表以及具有各種訪問模式的表的可伸縮性和可管理性。分區(qū)一方面可以將數(shù)據(jù)分為更小、更易管理的部分,為提高性能起到一定的作用;另一方面,對(duì)于如果具有多個(gè)CPU的系統(tǒng),分區(qū)可以使對(duì)表的操作通過并行的方式進(jìn)行,這對(duì)于提升性能是非常有幫助的。創(chuàng)建分區(qū)表的步驟:1、創(chuàng)建分區(qū)函數(shù)。分區(qū)函數(shù)是對(duì)數(shù)據(jù)進(jìn)行分區(qū)的依據(jù),分區(qū)函數(shù)定義了按分區(qū)列的值,將數(shù)據(jù)行映射到分區(qū)的機(jī)制。2、創(chuàng)建分區(qū)方案。分區(qū)方案根據(jù)分區(qū)函數(shù),將不同數(shù)據(jù)分區(qū)映射到不同的文件組中。通過文件組中數(shù)據(jù)文件在硬盤中物理位置的不同,實(shí)現(xiàn)將數(shù)據(jù)分別存儲(chǔ)到不同的硬盤或分區(qū)中,從而可以進(jìn)一步提高存儲(chǔ)的效率和系統(tǒng)性能。3、創(chuàng)建分區(qū)表。根據(jù)分區(qū)方案的要求創(chuàng)建分區(qū)表,今后數(shù)據(jù)存儲(chǔ)時(shí)會(huì)按照分區(qū)函數(shù)的設(shè)定分區(qū)存放。4.10分區(qū)表

創(chuàng)建分區(qū)函數(shù)CREATEPARTITIONFUNCTIONRangePF_orderTime(datetime)ASRANGELEFTFORVALUES(‘2005-12-31‘,‘2019-06-31',‘2020-02-01’)創(chuàng)建分區(qū)方案(架構(gòu))

CREATEPARTITIONSCHEMEORDERPSASPARTITIONRangePF_orderTimeTO(FLG1,FLG2,FLG3,FLG4)創(chuàng)建分區(qū)表CREATETABLE[dbo].訂單表_RANG(orderIDintIDENTITY(1,1)NOTNULL,ordertimedatetimeNULLDEFAULTGetdate(),customerIDintNOTNULL,StatusbitNOTNULLDEFAULT(0),shiptimedatetimeNULL)ONmyRangePS1(ordertime))

4.10分區(qū)表

insertintodbo.訂單表_RANG(ordertime,customerID)values('2004-07-01',1),('2005-07-01',1),(‘2019-07-01',1),('2010-01-20',1)

SELECTordertime,$PARTITION.[RangePF_orderTime](ordertime)as'分區(qū)號(hào)'FROM訂單表_RANG在數(shù)據(jù)庫應(yīng)用系統(tǒng)中,會(huì)使用到大量的非結(jié)構(gòu)化的數(shù)據(jù),如各種文檔和音視頻文件,數(shù)據(jù)庫管理系統(tǒng)管理這些非結(jié)構(gòu)化的文件比較困難。SQLServer在FILESTREAM基礎(chǔ)上,引入了FileTable,對(duì)非結(jié)構(gòu)化數(shù)據(jù)的管理功能得到了進(jìn)一步增強(qiáng)。FileTable既允許直接的、事務(wù)性的存取FILESTREAM列的大容量數(shù)據(jù);也可以配置為允許非事務(wù)性訪問的文件,由Windows文件系統(tǒng)直接訪問,而不需要事先得到SQLServer授權(quán)。這在很大程度方便了對(duì)非結(jié)構(gòu)性數(shù)據(jù)的管理,也簡(jiǎn)化了應(yīng)用程序?qū)Ψ墙Y(jié)構(gòu)性數(shù)據(jù)的處理。使用FileTable的步驟:1、啟用FILESTREAM。FILESTREAM是使用FileTable的基礎(chǔ)。因此,必須先啟用和配置FILESTREAM,才能使用FileTable。2、創(chuàng)建FileTable表。3、使用FileTable表。4.11FileTable1、啟用FILESTREAM。4.11FileTableSQLServer數(shù)據(jù)庫引擎實(shí)例中啟用FILESTREAM,進(jìn)入SQLServer配置管理器中并設(shè)置“SQLServer(MSSQLSERVER)屬性”,啟用FILESTREAM。啟用FILESTREAM進(jìn)行文件I/O流訪問。選中此項(xiàng)設(shè)置,允許Windows系統(tǒng)通過“Windows共享名”項(xiàng)設(shè)置的共享名進(jìn)行文件的讀寫操作。允許遠(yuǎn)程客戶端訪問FILESTREAM數(shù)據(jù)。選中此項(xiàng)設(shè)置,允許遠(yuǎn)程客戶端訪問存儲(chǔ)在此共享目錄中的FILESTREAM數(shù)據(jù)。1、啟用FILESTREAM。4.11FileTable數(shù)據(jù)庫引擎服務(wù)器選項(xiàng)設(shè)置。在SQLServerStudioManagement中,單擊工具欄“新建查詢”,執(zhí)行以下代碼,將數(shù)據(jù)庫引擎服務(wù)器的選項(xiàng)“FILESTREAM訪問級(jí)別”設(shè)置為“已啟用完全訪問”。EXECsp_configurefilestream_access_level,2RECONFIGURE數(shù)據(jù)庫添加FILESTREAM文件組CREATEDATABASECustomerONPRIMARY(NAME=Customer_data,FILENAME='c:\data\Customer_data.mdf'),FILEGROUPFileStreamGroup1CONTAINSFILESTREAM(NAME=Customer_data1,FILENAME='c:\data\filestream1')LOGON(NAME=Customer_log,FILENAME='c:\data\Customer_log.ldf')GO1、啟用FILESTREAM。4.11FileTable指定數(shù)據(jù)庫非事務(wù)性訪問的級(jí)別和FILETABLE的目錄

當(dāng)文件數(shù)據(jù)保存在SQLServer數(shù)據(jù)庫的FILETABLE時(shí),Windows應(yīng)用程序可以通過FileTable訪問FILESTREAM數(shù)據(jù),這需要給數(shù)據(jù)庫指定非事務(wù)性訪問的級(jí)別。上述操作可以通過設(shè)置數(shù)據(jù)庫選項(xiàng)“FILESTREAM非事務(wù)性訪問”來實(shí)現(xiàn),該選項(xiàng)有:FULL、READ_ONLY和OFF三個(gè)可選項(xiàng),其含義如下:FULL:完全的,即允許通過非事務(wù)性訪問讀寫FILESTREAM數(shù)據(jù)。READ_ONLY:只讀的,允許以只讀的方式通過非事務(wù)性訪問FILESTREAM數(shù)據(jù)。OFF:表示不允許通過非事務(wù)性訪問FILESTREAM數(shù)據(jù)。ALTERDATABASECustomerSETFILESTREAM(NON_TRANSACTED_ACCESS=FULL,DIRECTORY_NAME=N'Filestream目錄')DIRECTORY_NAME項(xiàng)的值要求在SQLServer數(shù)據(jù)庫引擎服務(wù)器實(shí)例中必須是唯一的,不能重復(fù)的。同樣,遵循Windows文件系統(tǒng)的命名規(guī)則,F(xiàn)ileTable目錄名是大小寫無關(guān)的,并且不能出現(xiàn)“/*\?”等非法字符。創(chuàng)建和使用FileTable表。4.11FileTable列名數(shù)據(jù)類型含義path_locatorhierarchyid是FileTable表的主鍵,用于指明節(jié)點(diǎn)在文件系統(tǒng)中的層次位置stream_id[uniqueidentifier]FILESTREAM數(shù)據(jù)的唯一標(biāo)識(shí)IDfile_streamvarbinary(max)保存FILESTREAM數(shù)據(jù)file_typenvarchar(255)文件的類型namenvarchar(255)文件或目錄的名稱parent_path_locatorhierarchyid包含目錄的hierarchyidcached_file_sizeBigintFILESTREAM數(shù)據(jù)的大小(以字節(jié)為單位)creation_timedatetime2(4)notnull文件的創(chuàng)建日期和時(shí)間last_write_timedatetime2(4)notnull上次更新文件的日期和時(shí)間last_access_timedatetime2(4)notnull上次訪問文件的日期和時(shí)間is_directorybitnotnull是否目錄is_offlinebitnotnull是否脫機(jī)文件is_hiddenbitnotnull是否隱藏文件is_readonlybitnotnull是否只讀文件is_archivebitnotnull是否存檔is_systembitnotnull是否系統(tǒng)文件is_temporarybitnotnull是否臨時(shí)文件UseCustomerGoCREATETABLEAttachFilesASFileTableWITH(FileTable_Directory='AttachFiles',FileTable_Collate_Filename=database_default);GO3、使用FileTable4.11FileTable1、拷貝文件到FileTable目錄2、查詢數(shù)據(jù)2、更改數(shù)據(jù)useCustomergoinsertintoAttachFiles(name,file_stream,creation_time)values('FileTable.txt',0x53514C2053657276657220323031322046696C655461626C65,getdate())go圖形數(shù)據(jù)表,是SQLServer用于管理實(shí)體或事務(wù)間對(duì)象關(guān)系的數(shù)據(jù)表。圖形數(shù)據(jù)表由節(jié)點(diǎn)表(Node)和邊界表(Edge)組成;相應(yīng)地含有圖形表的數(shù)據(jù)庫也被稱為圖形數(shù)據(jù)庫。在圖形數(shù)據(jù)庫中,節(jié)點(diǎn)表用于存儲(chǔ)各種事務(wù)和對(duì)象,一個(gè)圖形數(shù)據(jù)庫中可以有多個(gè)節(jié)點(diǎn)表;邊界表用于表示節(jié)點(diǎn)之間的關(guān)系,同樣也可以有多個(gè)邊界表。

圖形數(shù)據(jù)庫,可以較好地存儲(chǔ)和反映客觀世界中存在的事務(wù)和實(shí)體之間的關(guān)系,如學(xué)生信息和課程信息是兩個(gè)實(shí)體,可以使用節(jié)點(diǎn)表來存儲(chǔ);學(xué)生選修課程的信息,記錄的是學(xué)生實(shí)體與課程實(shí)體之間的關(guān)聯(lián)關(guān)系,可以使用邊界表來存儲(chǔ)。圖形數(shù)據(jù)庫在需要存儲(chǔ)“多對(duì)多”等較為復(fù)雜的關(guān)聯(lián)關(guān)系的場(chǎng)合,使用更為方便。SQLServer為支持這種復(fù)雜數(shù)據(jù)的存取,提供了查詢謂詞Match,Match可在where語句中使用,用于構(gòu)造實(shí)體間的關(guān)系條件。4.12圖形數(shù)據(jù)表圖形表的創(chuàng)建需要采用T-SQL代碼,且創(chuàng)建語句與普通表的創(chuàng)建語句很相似,不同之處是在語句的末尾需要添加ASNODE或ASEDGE。如果添加ASNODE,表示創(chuàng)建的是節(jié)點(diǎn)表,相應(yīng)的ASEDGE表示創(chuàng)建的是邊界表。4.12.1創(chuàng)建圖形表UseSchoolgoCreateTableStudent(StudentIDintIDENTITY(1,1)NOTNULLprimarykey,StudentNamenvarchar(20),Gendernvarchar(10),mClassnvarchar(10))AsNodeGoUseSchoolgoCreateTableCourse(CourseIDintIDENTITY(1,1)NOTNULLprimarykey,CourseNamenvarchar(20),tNotenvarchar(max))AsNodeGo課程信息表(Course)學(xué)生信息表(Student)4.12.1創(chuàng)建圖形表insertinto[dbo].[Student]([StudentName],[Gender],[mClass])values('A','男','機(jī)械工程'),('B','男','機(jī)械工程')Insertinto[dbo].[Course](CourseName,tNote)Values('計(jì)算機(jī)應(yīng)用基礎(chǔ)','講授計(jì)算機(jī)的基本應(yīng)用知識(shí)'),('SQLServer2019','講授最新的SQLServer數(shù)據(jù)庫知識(shí)')創(chuàng)建選課表(CourseSele)選課表,用于保存學(xué)生的選課信息,是學(xué)生實(shí)體與課程實(shí)體之間的關(guān)系數(shù)據(jù),這是一張邊界(Edge)表4.12.1創(chuàng)建圖形表UseSchoolgoCreateTableCourseSele(dtSeleDateTime)AsEdgeGo$edge_id、$from_id、$to_id,分別表示記錄的id值、第一個(gè)Node記錄的id、第二個(gè)Node記錄的id,當(dāng)用戶往CourseSele表中添加數(shù)據(jù)時(shí),$from_id、$to_id可以分別來源于Student和Course表。使用圖形4.12.1創(chuàng)建圖形表Inserti1to[dbo].[CourseSele]Values((select$node_idfrom[dbo].[Student]where[StudentID]=1),(select$node_idfrom[dbo].[Course]where[CourseID]=1),getdate())Insertinto[dbo].[CourseSele]Values((select$node_idfrom[dbo].[Student]where[StudentID]=1),(select$node_idfrom[dbo].[Course]where[CourseID]=2),getdate())Insertinto[dbo].[CourseSele]Values((select$node_idfrom[dbo].[Student]where[StudentID]=2),(select$node_idfrom[dbo].[Course]where[CourseID]=1),getdate())學(xué)號(hào)為1的學(xué)生選修課號(hào)為1,2的課,學(xué)號(hào)為2的學(xué)生選修課號(hào)為1的課4.12.2查詢圖形表數(shù)據(jù)查看StudentID為1的學(xué)生選課的信息,Match謂詞用于where語句中,構(gòu)建一個(gè)關(guān)聯(lián)學(xué)生(Student)和課程(Course)間關(guān)系的條件,關(guān)聯(lián)關(guān)系存儲(chǔ)在兩表中間的邊界表CourseSele中。Select[StudentName],[Gender],[mClass],[CourseName],[tNote],[dtSele]FromStudent,Course,CourseSeleWhereMatch(Student-(CourseSele)->Course)And[StudentID]=14.12.3邊界表約束邊界表CourseSele事實(shí)上是一個(gè)通用的實(shí)體關(guān)系數(shù)據(jù)表,不僅可以保存學(xué)生(Student)實(shí)體和課程(Course)實(shí)體間的關(guān)聯(lián)關(guān)系;還可以保存任何其他實(shí)體之間的關(guān)系。如果需要確保CourseSele表只能保存學(xué)生(Student)實(shí)體和課程(Course)實(shí)體間的關(guān)聯(lián)關(guān)系,可以通過對(duì)邊界表添加約束來實(shí)現(xiàn)。UseSchoolgoCreateTableCourseSeleWithConstraint(dtSeleDateTime,CONSTRAINTConstraint_seleCONNECTION(StudentTOCourse))AsEdgeGo此邊界表的約束Constraint_sele要求保存的關(guān)系數(shù)據(jù)必須從學(xué)生(student)關(guān)聯(lián)到課程表(Course),而不能相反。同樣,其他實(shí)體間的關(guān)聯(lián)關(guān)系也因此約束不能保存到此邊界表。DECLARE@StudentIDINT=2DECLARE@CourseIDINT=2INSERTINTO[dbo].[CourseSeleWithConstraint]($from_id,$to_id,dtSele)SELECTS.$node_id,C.$node_id,getdate()FROMStudentS,CourseCWHERES.StudentID=@StudentIDANDC.CourseID=@CourseID4.12.3邊界表約束DECLARE@StudentIDINT=2DECLARE@CourseIDINT=2INSERTINTO[dbo].[CourseSeleWithConstraint]($from_id,$to_id,dtSele)SELECTC.$node_id,S.$node_id,getdate()–此處有修改FROMStudentS,CourseCWHERES.StudentID=@StudentIDANDC.CourseID=@CourseIDDECLARE@StudentIDINT=2DECLARE@CourseIDINT=2INSERTINTO[dbo].[CourseSeleWithConstraint]($from_id,$to_id,dtSele)SELECTS.$node_id,C.$node_id,getdate()FROMStudentS,CourseCWHERES.StudentID=@StudentIDANDC.CourseID=@CourseID4.12.3邊界表約束ALTERTABLECourseSeleWithConstraintADDCONSTRAINTConstraint_CourseCONNECTION(StudentTOCourse,TeacherTOCourse)GOALTERTABLECourseSeleWithConstraintDROPCONSTRAINTConstraint_seleGOUseSchoolgoCREATETABLETeacher([TeacherID]INTEGERNOTNULL,[TeacherName]NVARCHAR(100)NOTNULL,[Gender]NVARCHAR(10)NOTNULL)ASNODEGO建立邊界表約束之后,對(duì)節(jié)點(diǎn)表中的實(shí)體數(shù)據(jù)進(jìn)行操作時(shí),需要遵守邊界表約束的要求。如從節(jié)點(diǎn)表中刪除一條在邊界表中存在約束關(guān)系的節(jié)點(diǎn)實(shí)體數(shù)據(jù)時(shí),會(huì)被阻止;如果確實(shí)需要?jiǎng)h除,可以先刪除邊界表中的約束數(shù)據(jù)。同樣的修改和新增數(shù)據(jù)也都需要滿足這種對(duì)應(yīng)關(guān)系。這種針對(duì)圖形表添加邊界表約束的方法,可以提高數(shù)據(jù)完整性。4.13時(shí)態(tài)數(shù)據(jù)表時(shí)態(tài)數(shù)據(jù)表,也被稱為系統(tǒng)版本控制表,是SQLServer提供的一種特殊的用戶數(shù)據(jù)表,其主要作用是用于管理和控制數(shù)據(jù)變更的歷史記錄。如,在用戶修改或刪除某些數(shù)據(jù)后,可能需要查看修改或刪除之前的數(shù)據(jù)。時(shí)態(tài)記錄表,通過記錄表中數(shù)據(jù)行的操作歷史,可以實(shí)現(xiàn)數(shù)據(jù)行級(jí)的控制和管理,由此,也使此項(xiàng)操作效率有了很大提高。時(shí)態(tài)數(shù)據(jù)表,由系統(tǒng)版本源表和歷史表兩部分組成,即當(dāng)一個(gè)用戶數(shù)據(jù)表被定義為時(shí)態(tài)數(shù)據(jù)表,此時(shí)態(tài)數(shù)據(jù)表就包含一個(gè)保存當(dāng)前數(shù)據(jù)的系統(tǒng)版本源表和與之對(duì)應(yīng)的保存操作歷史記錄的歷史表。系統(tǒng)版本源表與歷史表一一對(duì)應(yīng)。4.13.1生成時(shí)態(tài)數(shù)據(jù)表創(chuàng)建新時(shí)態(tài)數(shù)據(jù)表需要采用T-SQL語句,創(chuàng)建語句與新建普通用戶表的語法基本相似,不同此之外是:需要添加類型為datetime(2)的StartDate和EndDate列,且不允許為NULL;需要添加SYSTEM_VERSIONING=ON選項(xiàng);同時(shí)還需要在表中定義主鍵。其中StartDate列用于保存行數(shù)據(jù)更改時(shí)的時(shí)間,EndDate列用于保存行數(shù)據(jù)更改結(jié)束的時(shí)間,這兩列的值由系統(tǒng)自動(dòng)生成。1.創(chuàng)建新時(shí)態(tài)數(shù)據(jù)表UseNetSalegoCREATETABLE[dbo].客戶時(shí)態(tài)數(shù)據(jù)表(CustomerIDintIDENTITY(1,1)NOTNULLPRIMARYKEY,CustomerNamevarchar(200)NULL,ShipAddressvarchar(50)NULL,Postcodevarchar(6)NULL,TELvarchar(20)NULL,EMAILvarchar(50)NULL,[StartDate][datetime2](0)

GENERATED

ALWAYS

AS

ROW

START

NOT

NULL,

[EndDate]

[datetime2](0)

GENERATED

ALWAYS

AS

ROW

END

NOT

NULL,

PERIOD

FOR

SYSTEM_TIME([StartDate],[EndDate]))

WITH

(SYSTEM_VERSIONING=ON(HISTORY_TABLE

=

[dbo].[客戶時(shí)態(tài)數(shù)據(jù)歷史表]))4.13.1生成時(shí)態(tài)數(shù)據(jù)表現(xiàn)有的數(shù)據(jù)表,也可以轉(zhuǎn)化成為時(shí)態(tài)數(shù)據(jù)表,使用的T-SQL語句為AlterTable。要把已有數(shù)據(jù)表轉(zhuǎn)化為時(shí)態(tài)表,要求此表必須定義主鍵,且需要給此表添加兩個(gè)數(shù)據(jù)類型為datetime2的開始和結(jié)束時(shí)間列,列名為StartDate和EndDate,以及需要給表添加系統(tǒng)時(shí)間段列Period。如以下代碼將“訂單表”由普通數(shù)據(jù)表轉(zhuǎn)化為時(shí)態(tài)數(shù)據(jù)表。2.在已有表中生成時(shí)態(tài)數(shù)據(jù)表UseNetSalegoALTERTABLE訂單表ADDStartDatedatetime2(0)GENERATEDALWAYSASROWSTARTCONSTRAINTP_StartDateConstraintDEFAULT'2000.01.01',EndDatedatetime2(0)GENERATEDALWAYSASROWENDCONSTRAINTP_EndDateConstraintDEFAULTCONVERT(DATETIME2,'9999-12-3123:59:59'),PERIODFORSYSTEM_TIME(StartDate,EndDate);ALTERTABLE訂單表

set(system_versioning=on)4.13.2使用時(shí)態(tài)數(shù)據(jù)表insertinto[dbo].[客戶時(shí)態(tài)數(shù)據(jù)表]([CustomerName],[ShipAddress],[Postcode],[TEL],[EMAIL])values('華為','深圳華為','123456','1234567890','hw@')1.時(shí)態(tài)數(shù)據(jù)表的Insert、Update和Delete執(zhí)行完畢后,可以看到“客戶時(shí)態(tài)數(shù)據(jù)表(經(jīng)版本控制的系統(tǒng))”,即系統(tǒng)版本源表中新增了一條記錄,但是查看歷史表“客戶時(shí)態(tài)數(shù)據(jù)歷史表(歷史記錄)”中未有新增的記錄,表明新增數(shù)據(jù)不會(huì)影響歷史表。update客戶時(shí)態(tài)數(shù)據(jù)表setShipAddress='中國深圳華為'whereCustomerName='華為'deletefrom[dbo].[客戶時(shí)態(tài)數(shù)據(jù)表]whereCustomerName='華為'4.13.2使用時(shí)態(tài)數(shù)據(jù)表2.時(shí)態(tài)數(shù)據(jù)表的Select操作對(duì)時(shí)態(tài)數(shù)據(jù)表執(zhí)行Select操作除按時(shí)間條件過濾數(shù)據(jù)外,其余查詢條件的構(gòu)建與普通表相同。如果需要從時(shí)態(tài)數(shù)據(jù)表查找指定時(shí)間的歷史數(shù)據(jù),可以采用FORSYSTEM_TIME子句。如可以查詢特定時(shí)間的記錄,也可以查找指定范圍的記錄,需要注意的是查詢的表只能是系統(tǒng)版本源表,而不能是歷史表。(1)查詢指定時(shí)間的數(shù)據(jù)select*from[dbo].[客戶時(shí)態(tài)數(shù)據(jù)表]FORSYSTEM_TIMEASOF'2019-12-2410:38:37'whereCustomerName='華為'select*from[

溫馨提示

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

評(píng)論

0/150

提交評(píng)論