在平時的專案開發中,我相信有很大一批人都在用這個資料庫自增id,用資料庫自增id有利也有弊。
優點:節省時間,根本不用考慮怎麼來標識唯一記錄,寫程式也簡單了,資料庫幫我們維護著這一批id號。
缺點:for example, 在做分布式資料庫時,要求資料同步時,這種自增id就會出現嚴重的問題,因為你無法用該id來唯一標識記錄。同時在資料庫做移植時,也會出現各種問題,總之,對此自增id有依賴的情況,都有可能出現問題。我絕對相信園子裡有很一部分人都被這個「好用的東西」 曾經害慘過!
我平時在開發專案的時候,一般都沒有用到資料庫的自增id, 所以我想分享一下自己的解決方法。
解決思路:
1:定義一張表,專門用來存放存所有需要唯一id的表名稱以及該錶當前所使用到的id值。
2: 寫乙個儲存過程,專門用來在上一步的表中取id值。
這個思路非常簡單,我不作解釋了,直接來看看我的實現方法:
第一步:建立表
create table table_key
(table_name varchar(50) not null primary key,
key_value int not null
)第二步:建立儲存過程來取自增id
create procedure up_get_table_key
(@table_name varchar(50),
@key_value int output)as
begin
begin tran
declare @key int
–initialize the key with 1
set @key=1
–whether the specified table is exist
if not exists(select table_name from table_key where table_name=@table_name)
begin
insert into table_key values(@table_name,@key) –default key vlaue:1
end– step increase
else
begin
select @key=key_value from table_key with (nolock) where table_name=@table_name
set @key=@key+1
–update the key value by table name
update table_key set key_value=@key where table_name=@table_name
end–set ouput value
set @key_value=@key
–commit tran
commit tran
if @@error>0
rollback tran
end對於在表中不存在記錄,直接返回乙個預設值為1的鍵值,同時插入該條記錄到table_key表中。而對於已存在的記錄,key值直接在原來的key基礎上加1.
總結一下,這種方法非常簡單,我說一下它的優缺點。
優點:1:id值是可控的。使用者可以從指定段開始分配id值,這對於在分布式資料要求同資料同步時,非常方便,很好地解決了id重複的問題。
2:在編寫程式中,id值是可見的,比如在再插入關聯的記錄時,相比使用資料庫自增id的情況下,這種方法不需要在插入一條資料庫記錄之後,再去得到自增id值,然再再使用該id的值來插入關聯的記錄。我們可以一次性使用事務來插入關聯記錄。
3:對於需要批量插入資料時,我們可以改寫一下上面的儲存過程,返回乙個段的開始id,然後更新表時需要注意,不是原來的簡單的遞增1,而是遞增你想要的插入多少條記錄的總數。
缺點:1:效率問題,每次取id值都需要呼叫儲存過程從資料庫中檢索一次。對於這種情況,我覺得效率不是很大問題,因為sql server 會對我們經常呼叫的儲存過程有快取,再一點,這個表的資料應該不會很大,最多上千條(乙個專案中上千個表的情況應該不是很多吧)。所以檢索不是什麼問題,何況是根據表名來檢索(表名列已是主鍵)。
2:併發問題。
很多人有提到!不過凡事都是一把雙刃劍,這就好比做優化,要麼以時間換空間,要麼以空間換時間,這個世界上根本不存十全十美的事物!
資料庫ID自增優缺點?
優點 1.自增,趨勢自增,可作為聚集索引,提公升查詢效率 2.節省磁碟空間。500w資料,uuid佔5.4g,自增id佔2.5g.3.查詢,寫入效率高 查詢略優。寫入效率自增id是uuid的四倍。缺點 1.匯入舊資料時,可能會id重複,導致匯入失敗。2.分布式架構,多個mysql例項可能會導致id重...
SQL GUID和自增列做主鍵的優缺點
sql guid和自增列做主鍵的優缺點 我們公司的資料庫全部是使用guid做主鍵的,很多人習慣使用int做主鍵。所以呢,這裡總結一下,將兩種資料型別做主鍵進行乙個比較。使用int做主鍵的優點 1 需要很小的資料儲存空間,僅僅需要4 byte 2 insert和update操作時使用int的效能比gu...
SQL GUID和自增列做主鍵的優缺點
sql guid和自增列做主鍵的優缺點 我們公司的資料庫全部是使用guid做主鍵的,很多人習慣使用int做主鍵。所以呢,這裡總結一下,將兩種資料型別做主鍵進行乙個比較。使用int做主鍵的優點 1 需要很小的資料儲存空間,僅僅需要4 byte 2 insert和update操作時使用int的效能比gu...