亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQLServer 2005 和自增長主鍵identity說再見—

系統 2177 0

SQLServer2005 環境下 , 表的主鍵應該怎樣設計 .

目前主要用到的主鍵方案共三種

自動增長主鍵

手動增長主鍵

UNIQUEIDENTIFIER 主鍵

1 、先說自動增長主鍵 , 它的優點是簡單 , 類型支持 bigint. 但是它有致命的弱點 :

當我們需要在多個數據庫間進行數據的復制時( SQL Server 的數據分發、訂閱機制允許我們進行庫間的數據復制操作),自動增長型字段可能造成數據合并時的主鍵沖突。設想一個數據庫中的 Order 表向另一個庫中的 Order 表復制數據庫時, OrderID 到底該不該自動增長呢?

2 、再說手動增長主鍵 , 它的優點是自行定制主鍵列 , 主鍵列的數據類型乃至數據樣本都可以控制 , 能夠穩定的獲得目標鍵值 , 不會重復 . 但是它維護成本比較搞 , 首先生成鍵值需要自行編寫存儲過程來產生 , 網絡開銷大 , 運行時還要考慮到并發沖突等等 .

3 、最后就是 UNIQUEIDENTIFIER 主鍵 , 它利用 GUID 作為鍵值 , 可以直接調用 newid() 來獲得全局唯一標識 , 即便合并數據表也不會有重復現象 . 但是 UGID 有兩個弱點 : 其一 , int 類型比較 ,GUID 長度是前者 4 . 其二 , newid() 獲得的 GUID 毫無規律 , 因為該列作為主鍵 , 必然有聚集索引 , 那么在插入新數據時 , 將是一個非常耗時的操作 . 這樣的話 UNIQUEIDENTIFIER 作為主鍵將大大有損效率 .

所以 SQLServer2000 環境下 DBA 們往往寫一個存儲過程來生成與時間有關的 GUID, 即在 GUID 前面加上生成時間 . 這樣確保生成出來的主鍵全局唯一并且按時間遞增 . 不過這又回到了第二種主鍵方案 , 不便維護 .

4 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 jobs

結果:

SQLServer 2005 和自增長主鍵identity說再見——NEWSEQUENTIALID()

-- 使用 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

-- 對比下數據

select * from jobs

結果:

SQLServer 2005 和自增長主鍵identity說再見——NEWSEQUENTIALID()

--ROWGUIDCOL 是主鍵列的別名 , 可以直接當做列名來使用

-- 這樣可以忽略主鍵列的名稱

insert jobs ( account , password ) values ( 'etudou' , '123' )

select ROWGUIDCOL from jobs

結果:

SQLServer 2005 和自增長主鍵identity說再見——NEWSEQUENTIALID()

SQLServer 2005 和自增長主鍵identity說再見——NEWSEQUENTIALID()


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一级毛片特级毛片免费的 | 国产一区在线视频观看 | 亚洲精品综合网 | 色婷婷六月 | 亚洲精品国产字幕久久不卡 | 国产免费无遮挡精品视频 | 欧美亚洲另类色国产综合 | 久久亚洲成人 | 伊人国产精品 | 四虎成人影院网址 | 国产大学生一级毛片绿象 | 爱爱爱免费视频 | 色综合久久久久综合体桃花网 | 五月婷婷国产 | 奇米第八色 | 久久久夜色精品国产噜噜 | 91亚洲在线 | 日韩三级久久 | 亚洲一区二区欧美 | 操美女穴 | 中文字幕天堂久久精品 | 国产一区二区三区亚洲欧美 | 亚洲视频中文字幕在线观看 | 一级特黄aaa大片大全 | 国产青草视频免费观看97 | 中文在线1区二区六区 | 欧美人交性视频在线香蕉 | 内衣办公室动漫久久影院 | 精品毛片视频 | 国产一区二区三区毛片 | 中文字幕 国产精品 | 国产xx肥老妇视频奂费 | 精品久久久久久久久久久 | 午夜视频福利在线 | 伊在人亚洲香蕉精品区麻豆 | 看免费5xxaaa | 亚洲高清免费视频 | 天天躁日日2018躁狠狠躁 | videos欧美黑白爆交 | 国产一区二区三区免费在线视频 | 国产伦精品一区二区三区免费迷 |