天天看點

轉帖雜和資料庫------- SQL-server 資料庫相關知識 事務、索引、視圖

-- SQL-server 資料庫相關知識 事務、索引、視圖

2007年12月20日 星期四 18:34

/******************************************************************************************************************************************/

--       SQL-server 資料庫相關知識   事務、索引、視圖  

--( 一 問題闡述 舉例:銀行的轉賬業務就是典型的一個事務事例)

-- 一、二部分的代碼建議分開執行,更容易了解

use master

go

--判斷是否已經存在銀行資料庫Bank 如果存在了就删除那個資料庫,

if exists(select *from sysdatabases where name='bank')

begin

drop database bank

end

--在E盤建立一個檔案夾存放資料庫檔案

exec xp_cmdshell 'md e:\ChinaBank'

--建立一個簡單的銀行資料庫

create database Bank

on primary

(

name='Bank_Date',

filename='e:\ChinaBank\bank_date.MDF',

SIZE=1MB,

MAXSIZE=100MB,

FILEGROWTH=1%

)

LOG ON

name='Bank_LOG',

filename='e:\ChinaBank\bank_log.LDF',

GO

use Bank

--建立銀行使用者資訊表

create table userInfo

customerName char(10) not null,

customerBalance money not null

/*--添加限制:根據銀行規定,賬戶餘額不能低于1元,否則視于銷戶---*/

alter table userInfo

add constraint ck_userInfo_customerBalance check(customerBalance>=1)

/*---插入測試資料-----*/

insert userInfo(customerName,customerBalance)

select '張三',1000 union

select '李四',1

select *from userInfo

/*現在開始模拟轉賬,張三轉賬一千元到李四賬戶裡,那麼張三的賬戶裡應該隻剩下1元,李四賬戶應該有1001元*/

update userInfo set customerBalance=CustomerBalance-1000 where customerName='張三'

update userInfo set customerBalance=CustomerBalance+1000 where customerName='李四'

--問題出來了,看見沒?張三的賬戶餘額并沒有減少,而李四卻多出1000元??????????

--這裡就展現了事務的概念,事務是單個的工作單元,如果某一事務成功,則在該事務中進行的所有資料更改均會送出,成為資料庫

--中永久組成部份,如果事務中遇到了錯誤且必須取消和復原,則所有資料更改均被清除,換句話說,你所作的操作均會被撤銷,

--事務也是一種機制,是一個操作序列,它包含了一組資料庫操作指令,并且所有的指令作為一個整體一起向系統送出或撤消操作請求,

--即這一組操作指令,要麼都執行要麼都不執行..

--上面的代碼執行一次.看看表記錄.你會發現我所說的.....

--下面的代碼執行一次.證明事務是不可分割的工作邏輯單元

---( 二 )下面重新來操作剛才的轉賬行為

--恢複賬戶資料 張三1000元,李四1元

update userInfo set customerBalance=1000 where customerName='張三'

update userInfo set customerBalance=1 where customerName='李四'

select *from UserInfo

--開始事務(表示事務從此開始.面的T-SQL語句都是一個整體)

begin transaction

--定義一個變量,用于累積事務執行過程中的錯誤

declare @errorSum int

set @errorSum=0 --(計數器)初始化為0表示沒有錯誤發生!

/*現在開始轉賬操作*/

--累積是否有錯,(在張三的賬戶中減去1000元,看是否執行成功,如果失敗,那麼@@error就能捕捉到一個錯誤,@@error是SQL-Server系統中定義的全局變量

set @errorSum=@errorSum+@@error

/*根據事務過程中的錯誤,來确認事務是送出還是撤消*/

--如果計數器不為0就說明這項轉賬事務中有錯誤

if @errorSum<>0

   --交易失敗!復原事務..

   rollback transaction

else

   --交易成功,送出事務

   commit transaction

--再次檢視表記錄,發現資料依然是原來的.沒有改變,再次證明了事務是一個不可分割的工作邏輯單元

--如果出現如下提示:是正常的.因為我們的表限制了賬戶餘額必須大于1.否則認為是銷戶,

--張三的賬戶中轉賬1000到李四賬戶中.那麼張三賬戶就隻有0元了.是以就有如下出錯提示,如果我們改為轉賬800,就不會出錯了

--伺服器: 消息 547,級别 16,狀态 1,行 1

--UPDATE 語句與 COLUMN CHECK 限制 'ck_userInfo_customerBalance' 沖突。該沖突發生于資料庫 'Bank',表 'userInfo', column 'customerBalance'。

--語句已終止。

--        下面講解索引

--索引是提供指針以指向存儲在表中指定列的資料值,然後然後根據指定的排序次序排列這些指針,就好像一本書的目錄一樣,通過搜尋索引找到特定的值,然後跟随指針

--到達包含該值的行。

--索引:是SQL-Server編排資料的内部方法,它為SQL-Server提供一種方法來編排查詢資料的路由.

-- 在此借用上面建好的bank資料庫做講解

--建立一張表存儲學号成績

create table studentScore

name varchar(10) not null,

score float not null

--初始化資料

insert studentScore(name,score)

select '張小',90 union

select '張三',84 union

select '李三',29 union

select '五三',45 union

select '王三',90 union

select '趙三',82 union

select '李四',20 union

select '陳三',84 union

select '何五',30

select *from studentScore

--下面以 為成績表 建立非聚集索引 為例 ,因為成績有可能重複

/*先來檢測一下是否已經存在該索引,如果存在就删除該索引,重建立一個*/

if exists(select *from sysindexes where name='ix_studentScore_score')

drop index studentScore.ix_studentScore_score

create nonclustered index ix_studentScore_score

on studentScore(score)

with fillfactor=10

--指定索引查詢,按ix_studentScore_score ,查出成績在40到90之間的學員姓名

select name from studentScore

(index=ix_studentScore_score)

where score between 40 and 90

--這裡我們可以指定按那個索引進行查詢,但是一般情況下不需要人工指定,SQL-server将會自動根據所建立的索引,優化查詢

--另外SQL-Server中還包括唯一索引,主鍵索引,聚集索引等,上例中使用的是非聚集索引

--唯一索引:不允許兩行具有相同的索引值,如果建有唯一限制,那麼自動就建立了唯一索引。

--主鍵索引:在資料庫關系圖中為表定義一個主鍵将自動建立主鍵索引,主鍵索引是唯一索引的特殊類型.

--聚集索引: 在聚集索引中,表中各行的實體順序與鍵值的邏輯(索引)順序相同,表中隻能有一個聚集索引.但可以有多個非聚集索引,

--         設定某列為主鍵,該列預設為聚集索引.

--                                                  下面講解 視圖

--視圖:使用視圖的好處:1、出于安全考慮,使用者不必看到整個資料庫結構,而隐藏部分資料;2、符合使用者日常業務邏輯,使他們對資料更容易了解

--視圖是一種虛拟表,通常是作為來自一個或多個表的行或列的子集建立的,同時也可以包含全部列和行。

--我們依然采用T-SQL語句來建立視圖

--

---檢測是否存在該視圖,如果存在就删除該視圖

if exists (select *FROM SYSOBJECTS WHERE name='view_studentScore_score')

drop view view_studentScore_score

/**建立視圖   這裡用的内聯接 涉及到了上面銀行客戶資訊表*/

create view view_studentScore_score

as select 姓名=name,成績=studentScore.score from studentScore

inner join userInfo

on studentScore.name=userInfo.customerName

--視圖是一個虛拟表,可以像實體表一樣打開,同樣支援增删改查操作,但在實際應用中僅做查詢使用....

select *from view_studentScore_score

select * from authors

--聲明遊标

declare @au_lname varchar(20)

declare mycursor cursor for select au_lname from authors

--打開

S2-ATM取款機SQL 2000腳本

2007年12月20日 星期四 18:33

--判斷是否存在bankDB資料庫,如果存在就删除它,另外建立一個

if exists (select *from sysdatabases where name='bankDB')

drop database ChinaBank

--在E盤建立一個bankDB檔案夾

exec xp_cmdshell 'md e:\bankDB'

create database ChinaBank

filename='e:\bankDB\bank_date.MDF',

FILEGROWTH=15%

filename='e:\bankDB\bank_log.LDF',