漫談SQL Server中的標識列

2021-04-19 05:44:38 字數 4059 閱讀 8037

漫談sql server中的標識列

一、標識列的定義以及特點

sql server中的標識列又稱識別符號列,習慣上又叫自增列。

該種列具有以下三種特點:

1、列的資料型別為不帶小數的數值型別

2、在進行插入(insert)操作時,該列的值是由系統按一定規律生成,不允許空值

3、列值不重複,具有標識表中每一行的作用,每個表只能有乙個標識列。

由於以上特點,使得標識列在資料庫的設計中得到廣泛的使用。

二、標識列的組成

建立乙個標識列,通常要指定三個內容:

1、型別(type)

在sql server 2000中,標識列型別必須是數值型別,如下:

decimal、int、numeric、**allint、bigint 、tinyint

其中要注意的是,當選擇decimal和numeric時,小數字數必須為零

另外還要注意每種資料型別所有表示的數值範圍

2、種子(seed)

是指派給表中第一行的值,預設為1

3、遞增量(increment)

相鄰兩個標識值之間的增量,預設為1。

三、標識列的建立與修改

標識列的建立與修改,通常在企業管理器和用transact-sql語句都可實現,使用企業管理管理器比較簡單,請參考sql server的聯機幫助,這

裡只討論使用transact-sql的方法

1、建立表時指定標識列

標識列可用 identity 屬性建立,因此在sql server中,又稱標識列為具有identity屬性的列或identity列。

下面的例子建立乙個包含名為id,型別為int,種子為1,遞增量為1的標識列

create table t_test

(id int identity(1,1),

name varchar(50)

) 2、在現有表中新增標識列

下面的例子向表t_test中新增乙個名為id,型別為int,種子為1,遞增量為1的標識列

--建立表

create table t_test

(name varchar(50)

) --插入資料

insert t_test(name) values('張三')

--增加標識列

alter table t_test

add id int identity(1,1)

3、判段乙個表是否具有標識列

可以使用 objectproperty 函式確定乙個表是否具有 identity(標識)列,用法:

select objectproperty(object_id('表名'),'tablehasidentity')

如果有,則返回1,否則返回0

4、判斷某列是否是標識列

可使用 columnproperty 函式確定 某列是否具有identity 屬性,用法

select columnproperty( object_id('表名'),'列名','isidentity')

如果該列為標識列,則返回1,否則返回0

4、查詢某錶標識列的列名

sql server中沒有現成的函式實現此功能,實現的sql語句如下

select column_name from information_schema.columns

where table_name='表名' and   columnproperty(      

object_id('表名'),column_name,'isidentity')=1

5、標識列的引用

如果在sql語句中引用標識列,可用關鍵字identitycol代替

例如,若要查詢上例中id等於1的行,

以下兩條查詢語句是等價的

select * from t_test where identitycol=1

select * from t_test where id=1

6、獲取標識列的種子值

可使用函式ident_seed,用法:

select ident_seed ('表名')

7、獲取標識列的遞增量

可使用函式ident_incr ,用法:

select ident_incr('表名')

8、獲取指定表中最後生成的標識值

可使用函式ident_current,用法:

select ident_current('表名')

注意事項:當包含標識列的表剛剛建立,為經過任何插入操作時,使用ident_current函式得到的值為標識列的種子值,這一點在開發資料庫應用程式的時候尤其應該注意。

下面主要總結一下標識列在複製中的處理方法

1、快照複製

在快照複製中,通常無須考慮標識列的屬性。

2、事務複製

舉例:發布資料庫a,訂閱資料庫b,出版物為t_test_a,訂閱表為t_test_b

create table t_test_a

(id int identity(1,1),

name varchar(50)

)create table t_test_b

(id int identity(1,1),

name varchar(50)

)在這種情況下,複製**將無法將新行複製到庫b,因為列id是標識列,不能給標識列顯示提供值,複製失敗。

這時,需要為標識列設定not for replication 選項。這樣,當複製**程式用任何登入連線到庫b上的表t_test時,該錶上的所有 not

for replication 選項將被啟用,就可以顯式插入id列。

這裡分兩種情況:

1、庫b的t_test表不會被使用者(或應用程式)更新

最簡單的情況是:如果庫b的t_test不會被使用者(或應用程式)更新,那建議去掉id列的標識屬性,只採用簡單int型別即可。

2、庫b的t_test表是會被其他使用者(或應用程式)更新

這種情況下,兩個t_test表的id列就會發生衝突,舉例:

在庫a中執行如下語句:

insert t_test_a(name) values('tom')(假設id列為1)

在庫b中執行如下語句:

insert t_test_b(name) values('pip')(假設id列為1)

這樣,就會在庫a和庫b的兩個表分別插入一條記錄,顯然,是兩條不同的記錄。

然而事情還沒有結束,待到預先設定的複製時間,複製**試圖把記錄"1 tom"插入到庫b中的t_test表,但庫b的t_test_b表已經存在

id為1的列,插入不會成功,通過複製監視器,我們會發現複製失敗了。

解決以上問題的方法有:

(1)為發布方和訂閱方的標識列指定不同範圍的值,如上例可修改為:

--確保該錶記錄不會超過10000000

create table t_test_a

(id int identity(1,1),

name varchar(50)

)create table t_test_b

(id int identity(10000000,1),

name varchar(50)

)(2)使發布方和訂閱方的標識列的值不會重複, 如

--使用奇數值

create table t_test_a

(id int identity(1,2),

name varchar(50)

)--使用偶數值

create table t_test_b

(id int identity(2,2),

name varchar(50)

)這種辦法可推廣,當訂閱方和發布方有四處時,標識列屬性的定義分別如下

(1,4),(2,4),(3,4),(4,4)

3、合併複製

採用事務複製中解決方法,只要使發布表和訂閱表標識列的值不重複既可。

1、建立表時指定標識列標識列可用 identity 屬性建立,因此在sql server中,又稱標識列為具有identity屬性的列或identity列。2、在現有表中新增標識列下面的例子向表t_test中新增乙個名為id,型別為int,種子為1,遞增量為1的標識列--建立表create table t_test(name varchar(50))

sql server標識 SQL SQL介紹

sql structured query language 語義是結構化語言,是一門 ansi 的標準計算機語言,用來訪問和運算元據庫系統 資料庫裡面有好多的資料,就像圖書管一樣有好多的書,書是由圖書管理員進行管理,那麼什麼東西能夠管理資料庫呢?沒錯就是資料庫管理系統 database manage...

Sql Server中如何準確獲得標識值

sql server有三種不同的函式可以用來獲得含有標識列的表裡最後生成的標識值 identity函式可以返回所有範圍內當前連線插入最後所生成的標識值 包括任何呼叫的儲存過程和觸發器 這個函式不止可以適用於表。函式返回的值是最後表插入行生成的標識值。最後是ident current函式,它可以用於所...

SQL Server手工插入標識列

如果我們在標識列中插入值,例如 insert member id,username values 10,admin 則在查詢分析器裡面會返回錯誤資訊 引用內容 伺服器 訊息 544,級別 16,狀態 1,行 1 當 identity insert 設定為 off 時,不能向表 member 中的標識...