SQL?Server新特性SequenceNumber用法介紹
簡(jiǎn)介
SequenceNumber是SQL Server2012推出的一個(gè)新特性。這個(gè)特性允許數(shù)據(jù)庫(kù)級(jí)別的序列號(hào)在多表或多列之間共享。對(duì)于某些場(chǎng)景會(huì)非常有用,比如,你需要在多個(gè)表之間公用一個(gè)流水號(hào)。以往的做法是額外建立一個(gè)表,然后存儲(chǔ)流水號(hào)。而新插入的流水號(hào)需要兩個(gè)步驟:
- 1.查詢(xún)表中流水號(hào)的最大值
- 2.插入新值(最大值+1)
現(xiàn)在,利用SQL Server2012中的Sequence.這類(lèi)操作將會(huì)變得非常容易。
SequenceNumber的基本概念
SequenceNumber的概念并不是一個(gè)新概念,Oracle早就已經(jīng)實(shí)現(xiàn)了(http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm)。與以往的Identity列不同的是。SequenceNumber是一個(gè)與構(gòu)架綁定的數(shù)據(jù)庫(kù)級(jí)別的對(duì)象,而不是與具體的表的具體列所綁定。這意味著SequenceNumber帶來(lái)多表之間共享序列號(hào)的遍歷之外,還會(huì)帶來(lái)如下不利影響:
- 與Identity列不同的是,Sequence插入表中的序列號(hào)可以被Update,除非通過(guò)觸發(fā)器來(lái)進(jìn)行保護(hù)
- 與Identity列不同,Sequence有可能插入重復(fù)值(對(duì)于循環(huán)SequenceNumber來(lái)說(shuō))
- Sequence僅僅負(fù)責(zé)產(chǎn)生序列號(hào),并不負(fù)責(zé)控制如何使用序列號(hào),因此當(dāng)生成一個(gè)序列號(hào)被Rollback之后,Sequence會(huì)繼續(xù)生成下一個(gè)號(hào),從而在序列號(hào)之間產(chǎn)生間隙。
SequenceNumber的用法
SequenceNumber在MSDN中定義的原型如代碼1所示。
CREATE SEQUENCE [schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]代碼1.Sequence的創(chuàng)建原型
由代碼1看以看到,參數(shù)相對(duì)比較簡(jiǎn)單。從指定數(shù)據(jù)類(lèi)型(INT兼容)到開(kāi)始計(jì)數(shù)點(diǎn),步長(zhǎng),最大值和最小值,是否循環(huán)和是否緩存幾個(gè)參數(shù)來(lái)設(shè)置Sequence。
下面圖1創(chuàng)建了一個(gè)簡(jiǎn)單的Sequence。

圖1.創(chuàng)建一個(gè)簡(jiǎn)單的Sequence并進(jìn)行使用
此時(shí),我們可以通過(guò)SQL Server 2012新增的視圖sys.sequences來(lái)看到剛才創(chuàng)建成功的Sequence,如圖2所示.

圖2.sys.sequences視圖
當(dāng)然我們可以這個(gè)序列按照順序插入表,如圖3所示。

圖3.在單表中插入序列
而SequenceNumber最重要的功能是在多表間共享序列號(hào),如圖4所示。

圖4.多表之間利用Sequence共享序列號(hào)
前面圖2可以看到,如果我們不指定Sequence的上限和下限,則默認(rèn)使用所指定數(shù)據(jù)類(lèi)型的最大值和最小值作為上限和下限(如圖2INT類(lèi)型的的上下限).當(dāng)達(dá)到上線(xiàn)后,可以指定循環(huán)來(lái)讓Sequence達(dá)到上限后從指定的開(kāi)始值重新開(kāi)始循環(huán)。如圖5所示。

圖5.Sequence設(shè)置上限下限和循環(huán)
還可以通過(guò)修改Sequence將其初始值指定為一個(gè)特定值,如圖6所示。

圖6.重置Sequence的值
Sequence一個(gè)需要注意的情況是Sequence只負(fù)責(zé)生成序列號(hào),而不管序列號(hào)如何使用,如果事務(wù)不成功或回滾,SequenceNumber仍然會(huì)繼續(xù)向后生成序列號(hào),如圖7所示。

圖7.Sequence僅僅負(fù)責(zé)生成序列號(hào)
我們還可以為Sequence指定緩存選項(xiàng),使得減少I(mǎi)O,比如,我們指定Cache選項(xiàng)為4,則當(dāng)前的Sequence由1增長(zhǎng)過(guò)4后,SQL Server會(huì)再分配4個(gè)空間變?yōu)閺?到8,當(dāng)分配到9時(shí),SQL Server繼續(xù)這以循環(huán),如果不指定Cache值,則值由SQL Server進(jìn)行分配。一個(gè)簡(jiǎn)單的例子如圖8所示。

圖8.為Sequence設(shè)置Cache選項(xiàng)
總結(jié)
本文講述了SequenceNumber的簡(jiǎn)單用法。Sequence是一個(gè)比較方便的功能,如果使用妥當(dāng),將會(huì)大大減少開(kāi)發(fā)工作和提升性能。
參考資料:
CREATE SEQUENCE (Transact-SQL)
到此這篇關(guān)于SQL Server新特性SequenceNumber用法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SQL?Server中Sequence對(duì)象用法
- SQL server中提示對(duì)象名無(wú)效的解決方法
- SQL Server 使用 Pivot 和 UnPivot 實(shí)現(xiàn)行列轉(zhuǎn)換的問(wèn)題小結(jié)
- SQL Server Transact-SQL編程詳解
- SQL?Server?數(shù)據(jù)庫(kù)基礎(chǔ)編程詳解
- SQL Server 數(shù)據(jù)庫(kù)的設(shè)計(jì)詳解
- SQL Server 的T-SQL高級(jí)查詢(xún)?cè)斀?/a>
- SQL Server 索引和視圖詳解
- SQL?Server的存儲(chǔ)過(guò)程詳解
- SQL?Server的觸發(fā)器詳解
相關(guān)文章
sqlserver 用戶(hù)權(quán)限管理,LINQ去除它的重復(fù)菜單項(xiàng)
事情是這樣的,我有三張表,用戶(hù)_角色關(guān)系表User_Role,角色_菜單關(guān)系表Role_Menu和菜單表2011-08-08
游標(biāo)刪除多個(gè)表里臟數(shù)據(jù)的方法
游標(biāo)刪除多個(gè)表里臟數(shù)據(jù)的方法,需要的朋友可以參考一下2013-03-03
SQL 雙親節(jié)點(diǎn)查找所有子節(jié)點(diǎn)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇SQL 雙親節(jié)點(diǎn)查找所有子節(jié)點(diǎn)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
SQLServer 2000 升級(jí)到 SQLServer 2008 性能之需要注意的地方之一
今天在 相同環(huán)境測(cè)試 2000 和 2008 性能 讓我意外的是 2008 明顯比2000 慢很多,因?yàn)椴荒芎?jiǎn)單的升級(jí),sql語(yǔ)句也需要優(yōu)化2012-02-02
sqlserver清除完全重復(fù)的數(shù)據(jù)只保留重復(fù)數(shù)據(jù)中的第一條
根據(jù)autoID刪除臨時(shí)表#tmp中的重復(fù)數(shù)據(jù),只保留每組重復(fù)數(shù)據(jù)中的第一條2014-07-07
MySQL 多表查詢(xún)實(shí)現(xiàn)分析
在一個(gè)數(shù)據(jù)庫(kù)中,可能存在多個(gè)表,這些表都是相互關(guān)聯(lián)的。2011-06-06
SQL SERVER 開(kāi)啟CDC 實(shí)操詳細(xì)
這篇文章主要個(gè)代價(jià)介紹SQL SERVER CDC開(kāi)啟實(shí)操詳細(xì)內(nèi)容,文明芝麻官內(nèi)容有詳細(xì)代碼及解說(shuō),需要的小伙伴可以參考一下2021-10-10

