前言:上次主要介紹的是sql server數據庫的搭建以及經過SSMS工具進行鏈接數據庫,本次內容主要介紹數據庫的表進行管理。在工做中DBA一般對數據庫進行建立和刪除以及修改表的內容,擴展和收縮、分離及附加。sql
表是存放數據、查找數據以及更新數據的基本數據構建,在對數據的操做都是在表的基礎上進行的,以及如何維護表。 注:實際上表是邏輯的存在,事實上數據存放在硬盤上面。數據庫
另外在建立數據庫的時候回造成兩個基本的庫文件主數據庫文件.mdf和事物日誌文件.ldf服務器
數據庫在磁盤上是以文件爲單位存儲的,由數據文件和事物日誌文件組成。一個數據庫至少應該包含一個數據文件和一個事物日誌文件。ide
數據庫建立在物理介質(磁盤)上的一個或多個文件上,它預先分配了被數據和事物日誌所要適用的物理存儲空間。存儲數據的文件叫作數據文件,數據文件包含數據和對象,如表和索引。存儲事物日誌的文件叫作事物日誌文件(又稱日誌文件)。函數
sql server 2008 R2數據庫有一下類型的文件工具
1. 主數據文件sqlserver
2. 輔數據文件優化
3. 事物日誌文件spa
4. 文件流設計
舉例說明
--建立數據庫
create database schoolDB
go
use schoolDB
go
這樣建立完的數據庫只有一個數據文件和一個事物日誌文件,查看方式在建立的schoolDB上右鍵選擇「屬性」--「文件」
能夠在界面中單擊「添加」增長新的數據文件schooldb2,之後再schooldb數據庫中建立新的表,表中的數據就會存放在schooldb和schoolDB2數據文件中。
數據文件在數據庫中存放的時候都有標識,咱們能夠經過sp_helpdb schoolDB
數據文件結構
數據文件1和數據文件3的結構若是所示:
數據文件由64kb大小的區(extend)組成的,每一個區由8個8KB的連續的頁組成的。
sqlserver所能識別的最小存儲單元被稱爲頁,一個頁的大小是8KB,是sql server 存儲數據的單位。
在數據庫中一頁的大小是8KB,在計算機中1KB就是1024,因此1頁能夠存放1024*8=8192個字節
1.1. 如何根據表的記錄數量估算佔用的磁盤空間
1.先算一個表中一行有多少個字節,例如學號字段6個字節,姓名字段8個字節,出生日期字段多少個字節
2.算一個頁可以存多少行
3.數據庫中的表天天增長多少行記錄,就可以算出天天要增長多少硬盤空間,這樣就可根據數據量估算規劃多大的空間。
在數據庫中建立一張Tstudent表
create TABLE TStudent (
StudentID varchar(10) NOT NULL,
Sname varchar(10) DEFAULT NULL,
sex char(2) DEFAULT NULL,
cardID varchar(20) DEFAULT NULL,
Birthday datetime DEFAULT NULL,
Email varchar(40) DEFAULT NULL,
Class varchar(20) DEFAULT NULL,
enterTime datetime DEFAULT NULL
)
go
10個字節+10個字節+2個字節+20字節+8字節+40字節+20字節+8個字節=118字節
Tstudent表的一個行有118個字節
若是天天增長10000條記錄,10000條記錄佔多少頁?
1頁能夠存放1024*8=8192個字節,拋去標頭96字節,真正存放的字節數就8192-96=8096字節。
一頁能存8096字節,一頁可以存8096/118=68條記錄
10000行有多少頁?10000/68=148(頁)
一頁是8KB,148*8==1184KB
在Tstudent表中存放10000條記錄須要預備出來1MB多的磁盤空間。這樣就能夠根據天天增長的記錄數,合理規劃好磁盤空間了。
如今Tstudent表中尚未插入任何記錄,因此佔用了0頁的數據
提供查看數據文件頁數的命令
select OBJECT_NAME(i.object_id) as 表名,data_pages as 數據頁數
from sys.indexes as i
join sys.partitions as p ON p.object_id=i.object_id and p.index_id=i.index_id
join sys.allocation_units as a ON a.container_id=p.partition_id
where i.object_id=object_id('dbo.TStudent')
執行教學環境中的存儲過程,添加10000條記錄
這個頁數和咱們剛纔算出來的有些差距,這是正常的,每一頁可能並無插入68條記錄。
事物是一個或多個T-SQL語句的集合,事物有一個特性:要麼執行成功,要麼執行失敗。每一個sql server數據庫都具備事物日誌,用於記錄全部事物的SQL語句。當發生數據災難時候,經過事物日誌記錄的T-SQL語句能夠恢復數據庫。
若是系統出現故障,sql server將使用事物日誌重作(前滾)全部已確認的事物,撤銷(回滾)全部未完成的事物。
使用圖形界面建立數據庫,在對象資源管理器中,右擊「數據庫」節點,在彈出的快捷菜單中選擇「新建數據庫」命令,打開「新建數據庫」窗口,設置數據庫名稱爲「class」,制定數據庫的全部者,默認建立數據庫的用戶將成爲該數據庫的全部者。主數據文件初始值爲3mb,自動增加值爲1mb,當數據文件或日誌文件空間使用完以後,會根據設定的自動增加值增大文件的容量。
在路徑列中能夠設置數據文件和日誌文件的保存路徑。單擊「肯定」以後一個新的數據庫就創建成功了,隨之會生成兩個文件一個是包含數據文件的.mdf,一個是包含日誌信息的.ldf文件。
建立數據庫以前,必須先肯定數據庫的名稱,全部者(建立數據庫的用戶),大小以及存儲該數據文件和事物日誌文件的位置。
若是要對數據庫作數據庫級別的設置
在數據庫屬性中選擇「選項」,在右側能夠修改數據庫相關的屬性。
當數據庫中的數據文件和日誌文件被充滿時候,須要爲數據文件和日誌文件分配更多的空間。sql server 能夠根據在新建數據庫時定義的增加參數自動擴展數據庫,也能夠經過在現有的數據文件上分配更多的文件空間,或者在另外一個新的數據文件上分配空間來手動擴展數據庫。
擴展數據庫時,必須使數據庫的容量至少增長1mb,還能夠指定容許文件增加到的最大值,這樣能夠防止文件無限制的增加,致使用盡整個磁盤空間。
舉例說明:
將class數據庫的class數據文件大小設置爲100MB,不自動增加,而後添加一個新的數據文件,文件名爲「class1」,初始文件大小設置爲「50MB」,自動增加,最大文件大小設置爲「500MB」
在對象資源管理器中,右擊class數據庫,在彈出的快捷菜單中選擇「屬性」命令,打開「數據庫屬性-class」窗口,在「數據庫屬性-class」窗口的「選擇頁」中選擇「文件」選項,打開「文件」選擇頁
配置爲以下圖所示:最後單擊「肯定」
數據庫在使用一段時間後,時常會由於數據刪除而形成數據庫中空閒空間增多的狀況,這時就須要減小分配給數據庫文件和事物日誌文件的磁盤空間,以避免浪費磁盤空間。當數據庫中沒有數據時,能夠修改數據庫文件屬性,直接改變其佔用空間,可是當數據庫中有數據時,這樣作會破壞數據庫中的數據,所以須要使用收縮的方式來縮減數據庫空間。
數據庫中的每一個文件均可以經過刪除未使用的空間的方法來減少,SQL server容許經過縮小數據庫,把不使用的空間釋放出來,數據文件和日誌文件均可以收縮。能夠採用手動收縮和自動收縮數據庫。
手動收縮數據庫的方法
從圖中能夠看出來便可以選擇收縮數據庫,也能夠選擇單獨收縮某個數據文件。
收縮數據庫:
在收縮數據庫時,沒法將整個數據庫收縮到比初始大小更小,若是數據庫建立時的大小是10mb,後來增加到10mb,則該數據庫最小隻能收縮到10mb,即便已經刪除了全部數據也是10mb。可是收縮文件時,能夠將數據庫文件收縮得比其初始大小更小
收縮數據文件
選擇--「任務」--「收縮」--「文件」命令,打開收縮文件對話框
在「文件類型」下拉列表框中選擇「數據」選項,也能夠在這裏選擇收縮日誌文件。」當前分配的空間「選項和」可用空間「選項顯示了該文件的佔用空間,使用空間和收縮的百分比。
釋放未使用的空間:將釋放文件中全部未使用的空間,並將文件收縮到上次分配的大小,這樣將減少文件大小,但不移動任何數據。
在釋放未使用空間前從新組織頁:將釋放文件中全部未使用的空間,並嘗試從新定位到未分配的空間。這裏須要指定」將文件收縮到「選項的值。
經過將數據遷移到同一文件組中的其餘文件來清空文件:將指定文件中全部數據遷移至同一文件組中的其餘文件中,而後能夠刪除空文件。
根據須要肯定選項,而後單擊「肯定」,執行收縮操做。
自動收縮數據庫
能夠經過設置「數據庫屬性--class」窗口中的「選項」選擇頁中的「自動收縮」選項參數來實現自動收縮功能。將「自動收縮」選項設置爲「true」後,將自動收縮可用空間的數據庫。
若是要將數據庫更改到同一計算機的不一樣sql server實例中或要移動數據庫,就可使用分離和附加數據庫的功能了。能夠分離數據庫的數據文件和日誌文件,而後將它們重新附加到同一其餘SQL Server實例中。
分離數據庫
分離數據庫是指將數據庫從SQL server實例中移除,可是要保證數據庫中的數據文件和日誌文件完整無損。這些分離的數據文件和日誌文件能夠附加到其餘的數據庫實例中。
舉例說明:
將class數據庫進行分離
在對象資源管理器中右擊class數據庫,在彈出的快捷菜單中選擇「任務」---「分離」命令,打開「分離數據庫」窗口。
數據庫中有一個或多個活動鏈接時,「消息」列將顯示活動鏈接的數量,如「一個活動鏈接」。必須選中「刪除鏈接」複選框以斷開全部活動鏈接。
默認狀況下,分離操做將在分離數據庫時保留過時的優化統計信息,若要更新現有的優化統計信息,能夠選中「更新統計信息」複選框。
附加數據庫
附加數據庫時,全部的數據文件(主數據文件和次要數據文件)都必須可用。若是任何數據文件的路徑不一樣於首次建立數據庫或上次附加數據庫時的路徑,則必須指定文件的當前路徑。
單擊「添加」按鈕,選擇「class.mdf」數據文件
單擊「肯定」以後,附加文件成功。
若是數據庫的事物日誌文件丟失,數據文件保持無缺,也能夠附加成功,在附加的時候,數據庫會自動新建事物日誌文件。
當用戶不在須要本身的數據庫時就能夠刪除數據庫了,但不能刪除系統數據庫。刪除數據庫後,文件及其數據都從服務器上的磁盤中刪除,一旦刪除數據庫,就會被永久刪除。
確認要刪除的數據庫
數據完整性:
實體完整性:確保每一行有一個惟一的標識列:
域完整性:規定該列可以接受的數據取值(域完整性)
引用完整性:表內和表間的列參照
用戶定義的完整性:列級約束和表級約束,存儲過程及觸發器
主鍵:惟一標識表中的記錄,一個主鍵值對應一行數據。主鍵由一個或多個字段組成,主鍵值具備惟一性,並且不容許取空值(null),一個表只能有一個主鍵。
若是主鍵由多個列組成,則其中一個列將容許有重複值,可是主鍵中全部列的值得各類組合必須是惟一的。
定義主鍵能夠對在不容許空值的指定列中輸入的值強制其惟一性。若是爲數據庫中的某個表定義了主鍵,則可將該表與其餘表相關連,從而減小對冗餘數據的要求。
sql server 中的每一個數據庫最多能夠存儲20億個表,每一個表能夠有1024列,表的行數及大小僅受可用存儲空間的限制,每行最多能夠存儲8060B,建立表時必須指定表名,列名即數據類型等。
1. 數字型表明數字 int tinyint smallint bigint 十進制小數 money smallmoney decimal 浮點數和real
2. 日期型 datetime 能夠精確到0.333毫秒 small
3. 字符型包括char和nchar 也包含變長字符類型varchar和nvarchar
4. 定長字符 char(20)
5. 變長字符 varchar(20)
6. Char 適合存放英文一個字符佔用1個字節
7. Nchar 適合存放中文一個字符佔用2個字節
8. 二進制型 Binary和varbinary,bit表明一位的值0或1,rowversion表明數據庫中惟一的8位二進制。
若是插入行時沒有爲列指定值,則該列使用默認值,默認值能夠是計算結果爲常量的任何值,能夠是表達式,內置函數或數學表達式。
對於表的每一個列,若是沒有分配默認的值,而且保留爲空白:則
1.若是設置了容許空值的選項,則將象該列中插入NULL
2.若是沒有設置容許爲空值,則該列將保持空白。但在用戶爲該列提供值以前,他們將沒法保存行。
對於每一個表,都可建立一個博暗含系統生成的序號值得標識付列,該序號值以惟一的方式標識表中的每一行。當在表中插入行時,標識符列可自動爲應用程序生成惟一的標號。
標識符列具備如下三種特色
1.列的數據類型爲不帶小數的數值類型
2.在進行插入操做時,該列的值有系統按必定規律生成,不容許用空值
3.列值不重複,具備標識表中每一行的做用。每一個表只能有一個標識列
建立標識列,一般指定三個內容
類型:decimal ,int,numeric,smallint,bigint,tinyint。其中decimal和numeric,小數位數必須爲零
種子:指派給表中第一行的值:默認爲「1」
地增量:相鄰兩個標識值之間的增量,默認爲1.
經過限制列可接收的值,check約束能夠強制域的完整性。此類約束相似於外鍵約束,由於能夠控制放入列中的值。可是他們在肯定有效值的方式上有所不一樣。外鍵約束從其餘表中得到有效值列表,而check約束經過不基於其餘列中的數據的邏輯表達式肯定有效值。
能夠經過任何基於邏輯運算符返回TRUE或FALSE的邏輯表達式建立check約束。
舉例說明:
能夠經過建立check約束將age列中的值得範圍限制在0-200之間的數據,以防止輸入的年齡值超出正常的年齡範圍,邏輯表達式爲:
age >=0 and age <=200
在class 數據庫中建立表,表名爲「student」,其中包含列爲:學生編號(int),姓名(nvarchar(50)),×××號(varchar(18)),所在班級(thinyint),成績(tinyint),備註(nvarchar(2000)),其中學生編號自動生成,從1開始,每增長1人則編號自動增長1,要求輸入成績的時候,其值必須爲0-100,設置×××號列爲主鍵:
爲學生編號列設置標識列,標識增量和標識種子設置爲「1」,如圖所示:
分別新建「姓名」,「×××號」,「所在班級」,「成績」,「備註」如圖所示
因爲要求輸入成績時,值必須是0-100,所以能夠在成績列設置「check約束」,
在打開的「check約束」對話框中,單擊「添加」按鈕,而後在「常規」文本框中輸入「表達式」爲「成績>=0 and 成績<=100」。單擊肯定便可
右擊「×××號」,在彈出的快捷菜單中選擇「設置主鍵」,可將該列設置爲主鍵,主鍵列的左邊會顯示「×××鑰匙」,圖標
設置完成後,保存該表,
輸入表的名稱「student」
在對象資源管理器中查看剛剛建立的student表
編輯student表,右擊表,在彈出的快捷菜單中選擇「編輯前200行」命令,而後能夠在表中插入、更新或刪除數據了
修改表的結構
若是須要修改表結構,在表中新增或刪除字段,則須要從新對錶進行設計,在對象資源管理器中,右擊student表,選擇「設計」命令
刪除表:若是須要刪除表,能夠右擊表student,在彈出的快捷菜單中選擇「刪除」命令
使用T-SQL語句操做數據表
使用iNSERT語句將數據插入到表中
INSERT INTO <表名> [列名] VALUES <值列表>
INSERT INTO student (姓名,×××號,所在班級,成績) VALUES ('百合','152323198201190045',2,90)
更新數據
使用UPDATE語句更新表中的數據
UPDATE <表名> set <列名 = 更新值> [WHERE <更新條件>]
update student set 成績=‘88’ where 姓名=‘玉蘭’
刪除數據
使用delete語句刪除表中的數據
DELETE FROM <表名> [WHERE <刪除條件>]
DELETE FROM student WHERE 姓名=‘玉蘭’
刪除student表中全部記錄
DELETE FROM student
使用truncate table 語句刪除表中的數據
truncate table 語句用來刪除表中的全部行,功能上相似於沒有WHERE子句的DELETE語句。
TRUNCATE TABLE <表名>
要刪除student表中的全部記錄,可使用以下語句
TRUNCATE TABLE student
TRUNCATE語句與DELETE語句的區別
1. TRUNCATE語句不帶WHERE子句,只能將整個表數據清空,而DELETE語句能夠帶WHERE子句,容許按條件刪除某些記錄
2. TRUNCATE語句不記錄事物日誌,而DELETE語句不管刪除多少條記錄,都會記錄事物日誌,因此使用TRUNCATE語句刪除數據後是沒法經過事物日誌恢復數據。
3. TRUNCATE語句刪除表中全部行,標識符列會重置爲0,而DELETE語句不會重置標識付列。
4. TRUNCATE語句不能用於有外鍵約束引用的表,這種狀況下須要使用DELETE語句。