``code數據庫
在SQLServer2005環境下,表的主鍵應該怎樣設計.
目前主要用到的主鍵方案共三種
自動增加主鍵
手動增加主鍵
UNIQUEIDENTIFIER主鍵
一、先說自動增加主鍵,它的優勢是簡單,類型支持bigint.可是它有致命的弱點:
當咱們須要在多個數據庫間進行數據的複製時(SQL Server的數據分發、訂閱機制容許咱們進行庫間的數據複製操做),自動增加型字段可能形成數據合併時的主鍵衝突。設想一個數據庫中的Order表向另外一個庫中的Order表複製數據庫時,OrderID到底該不應自動增加呢?
二、再說手動增加主鍵,它的優勢是自行定製主鍵列,主鍵列的數據類型乃至數據樣本均可以控制,可以穩定的得到目標鍵值,不會重複.可是它維護成本比較搞,首先生成鍵值須要自行編寫存儲過程來產生,網絡開銷大,運行時還要考慮到併發衝突等等.
三、最後就是UNIQUEIDENTIFIER主鍵,它利用GUID做爲鍵值,能夠直接調用newid()來得到全局惟一標識,即使合併數據表也不會有重複現象.可是UGID有兩個弱點:其一,和int類型比較,GUID長度是前者4倍.其二,用newid()得到的GUID毫無規律,由於該列做爲主鍵,必然有彙集索引,那麼在插入新數據時,將是一個很是耗時的操做.這樣的話UNIQUEIDENTIFIER做爲主鍵將大大有損效率.
因此SQLServer2000環境下DBA們每每寫一個存儲過程來生成與時間有關的GUID,即在GUID前面加上生成時間.這樣確保生成出來的主鍵全局惟一而且按時間遞增.不過這又回到了第二種主鍵方案,不便維護.
四、SQLServer 2005已經解決了這個問題,使用的是NEWSEQUENTIALID()
這個函數產生的GUID是遞增的,下面看下它的用法
--建立實驗表
--1建立id列的類型爲UNIQUEIDENTIFIER
--2ROWGUIDCOL只是這個列的別名,一個表中只能有一個
--3PRIMARY KEY肯定id爲主鍵
--4使用DEFAULT約束來自動爲該列添加GUID
create table jobs
(
id UNIQUEIDENTIFIER ROWGUIDCOL PRIMARY KEY NOT NULL
CONSTRAINT [DF_jobs_id] DEFAULT (NEWSEQUENTIALID()),
account varchar(64) not null,
password varchar(64) not null
)
go網絡
select * from jobs
--添加實驗數據
insert jobs (account,password) values ('tudou','123')
insert jobs (account,password) values ('ntudou','123')
insert jobs (account,password) values ('atudou','123')
insert jobs (account,password) values ('btudou','123')
insert jobs (account,password) values ('ctudou','123')併發
select * from jobside
--使用identity的是咱們能夠經過Select @@IDENTITY取到新添加的id
--使用UNIQUEIDENTIFIER怎麼辦呢?
--採起手動增加的方法select NEWSEQUENTIALID()先取出id再添加
--不行,語法不支持
--能夠經過下面的方法取到新添加數據的id
--在ADO.NET中的用法和Select @@IDENTITY同樣
DECLARE @outputTable TABLE(ID uniqueidentifier)
INSERT INTO jobs(account, password)
OUTPUT INSERTED.ID INTO @outputTable
VALUES('dtudou', '123')函數
SELECT ID FROM @outputTable設計
--ROWGUIDCOL是主鍵列的別名,能夠直接當作列名來使用
--這樣能夠忽略主鍵列的名稱code
insert jobs (account,password) values ('etudou','123')
select ROWGUIDCOL from jobs索引
--1. 定義臨時表變量
DECLARE @outputTable TABLE(ID uniqueidentifier)
INSERT INTO TABLE1(col1, col2)
OUTPUT INSERTED.ID INTO @outputTable
VALUES('value1', 'value2')
SELECT ID FROM @outputTableit
--2. 標記ID字段爲ROWGUID(一個表只能有一個ROWGUID)
INSERT INTO TABLE1(col1, col2)
VALUES('value1', 'value2')
--在這裏,ROWGUIDCOL其實至關於一個別名
SELECT ROWGUIDCOL FROM TABLE1io
``code