婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)

sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)

熱門標(biāo)簽:威海智能語(yǔ)音外呼系統(tǒng) 西安青牛防封電銷卡 重慶防封電銷機(jī)器人供應(yīng)商 400電話申請(qǐng)需要開(kāi)戶費(fèi)嗎 南京電銷外呼系統(tǒng)運(yùn)營(yíng)商 山西語(yǔ)音外呼系統(tǒng)價(jià)格 智能語(yǔ)音外呼系統(tǒng)哪個(gè)牌子好 北京辦理400電話多少 溫州語(yǔ)音外呼系統(tǒng)代理
主鍵的生成方式主要有三種:
一. 數(shù)據(jù)庫(kù)自動(dòng)生成
二. GUID
三. 開(kāi)發(fā)創(chuàng)建

嚴(yán)格講這三種產(chǎn)生方式有一定的交叉點(diǎn),其定位方式將在下面進(jìn)行講解。
第一種方式,主要將其定位在自增長(zhǎng)的標(biāo)識(shí)種子:可以設(shè)置起始數(shù)值,及增長(zhǎng)步長(zhǎng)。其優(yōu)點(diǎn)在于使用時(shí)完全將并發(fā)任務(wù)交于數(shù)據(jù)庫(kù)引擎管理,你不用擔(dān)心存在多用戶使用的時(shí)候會(huì)產(chǎn)生兩個(gè)相同的ID的情況。其缺點(diǎn)也在于此,多數(shù)的數(shù)據(jù)庫(kù)不提供直接獲取標(biāo)識(shí)ID的方式,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)產(chǎn)生ID的方式是透明的,開(kāi)發(fā)人員幾乎無(wú)法干預(yù)此項(xiàng)。對(duì)于數(shù)據(jù)的遷移也不是很方便。
由于存在上面的利弊,這種自增長(zhǎng)的ID一般多用于設(shè)計(jì)基礎(chǔ)表(系統(tǒng)運(yùn)行的基礎(chǔ)信息,如員工表)主鍵,而極少(根本不)用于主從表主、外鍵,因?yàn)樵诋a(chǎn)生主從表數(shù)據(jù)并關(guān)聯(lián)時(shí),必須確定主表的ID,然后才能定位從表的關(guān)聯(lián)ID。
例(MsSQL):
復(fù)制代碼 代碼如下:

--創(chuàng)建測(cè)試表
CREATE TABLE [Identity](
Id INT IDENTITY(1,2) NOT NULL PRIMARY KEY,--種子的起始值1,步長(zhǎng)2
Number VARCHAR(20) UNIQUE NOT NULL,
Name VARCHAR(20) NOT NULL,
Password VARCHAR(20) DEFAULT(123),
Description VARCHAR(40) NULL
)
--插入記錄
INSERT INTO [Identity](Number,Name,Description) VALUES('001','1st','Id=1,因?yàn)槠鹗贾?')
INSERT INTO [Identity](Number,Name,Description) VALUES('002','2nd','Id=3,因?yàn)槠鹗贾?,步長(zhǎng)2')
INSERT INTO [Identity](Number,Name,Description) VALUES('003','3rd','Id=5,由于字符長(zhǎng)度超長(zhǎng),報(bào)錯(cuò)插入失敗,造成此Id產(chǎn)生后被放棄')
INSERT INTO [Identity](Number,Name,Description) VALUES('004','4th','Id=7 not 5,因?yàn)榈谌龡l記錄插入失敗')
--檢索記錄,查看結(jié)果
SELECT * FROM [Identity]

結(jié)果:
(1 行受影響)
(1 行受影響)
消息 8152,級(jí)別 16,狀態(tài) 14,第 3 行
將截?cái)嘧址蚨M(jìn)制數(shù)據(jù)。
語(yǔ)句已終止。
(1 行受影響)
(3 行受影響)
Id Number Name Password Description
1 001 1st 123 Id=1,因?yàn)槠鹗贾?
3 002 2nd 123 Id=3,因?yàn)槠鹗贾?,步長(zhǎng)2
7 004 4th 123 Id=7 not 5,因?yàn)榈谌龡l記錄插入失敗
第二種方式,GUID即Globally Unique Identifier,也稱為UUID(Universally Unique IDentifier),全球唯一標(biāo)識(shí)符,GUID一般由32位十六進(jìn)制的數(shù)值組成,其中包含網(wǎng)卡地址、時(shí)間及其他信息。任何兩臺(tái)電腦都不會(huì)產(chǎn)生相同的GUID,他的優(yōu)點(diǎn)在唯一性,當(dāng)需要數(shù)據(jù)庫(kù)整合時(shí),能節(jié)約不少勞動(dòng)力。比如總公司和分公司各自系統(tǒng)獨(dú)立運(yùn)行,所有分公司數(shù)據(jù)定期需要提交到總部,可以避免合并數(shù)據(jù)時(shí)主鍵沖突問(wèn)題,同時(shí)GUID還兼具自增長(zhǎng)標(biāo)識(shí)種子特點(diǎn),無(wú)需開(kāi)發(fā)人員太多的關(guān)注。但是GUID信息量大,占用空間也大,關(guān)聯(lián)檢索時(shí),估計(jì)效率上也不是很高,對(duì)于32位的十六進(jìn)制其可讀性也差,雖然主鍵有對(duì)用戶的無(wú)意義性,但是在設(shè)計(jì)或者調(diào)試交流時(shí)很不方便。
從長(zhǎng)遠(yuǎn)考慮,為了保證數(shù)據(jù)的可移植性,一般還是會(huì)選擇使用GUID來(lái)作為主鍵。
例(MsSQL):
復(fù)制代碼 代碼如下:

--創(chuàng)建測(cè)試表
CREATE TABLE GUID(
Id UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,--當(dāng)然你也可以用字符串來(lái)保存
Number VARCHAR(20) UNIQUE NOT NULL,
Name VARCHAR(20) NOT NULL,
Password VARCHAR(20) DEFAULT(123)
)
--插入記錄
INSERT INTO GUID(Id,Number,Name) VALUES(NewID(),'001','1st')
INSERT INTO GUID(Id,Number,Name) VALUES(NewID(),'002','2nd')
INSERT INTO GUID(Id,Number,Name) VALUES(NewID(),'003','3rd')
--檢索記錄,查看結(jié)果
SELECT * FROM GUID

結(jié)果:
Id Number Name Password
8E194F55-B4D3-4C85-8667-33BC6CD33BBC 001 1st 123
7141F202-7D0E-4992-9164-5043EC9FC6F6 002 2nd 123
E0E365A0-8748-4656-AF24-5D0B216D2095 003 3rd 123
第三種方式開(kāi)發(fā)創(chuàng)建,其便捷性在于可控制性,此可控制性是指其組成形式,可以是整形、也可以是字符型,你可以根據(jù)實(shí)際情況給予多樣的組成及產(chǎn)生形式,說(shuō)到這里可能有的朋友就想起來(lái)自動(dòng)產(chǎn)生單號(hào),如:20120716001或者PI-201207-0001等等,沒(méi)錯(cuò),自我創(chuàng)建同樣適用于這些類似的應(yīng)用。
說(shuō)到自我創(chuàng)建,多數(shù)首先想到的是取Max(Id)+1,這種方式雖然省事,但是實(shí)際上對(duì)于定制(在生產(chǎn)單號(hào)之類的有一定意義的信息時(shí)可能會(huì)有這樣的需求,主鍵沒(méi)必要)及并發(fā)的處理并不是很好。如,當(dāng)前表中最大編號(hào)為1000,當(dāng)C1和C2用戶同時(shí)取這個(gè)Id處理時(shí),得到的都是1001,導(dǎo)致保存失敗。常規(guī)的做法是在取值時(shí)候加鎖,但是當(dāng)多用戶頻繁操作時(shí),性能是個(gè)很大的問(wèn)題,其中主要的原因之一是直接操作的業(yè)務(wù)數(shù)據(jù)表。
針對(duì)此種情況,解決方案是使用鍵值表來(lái)保存表名、當(dāng)前或者下一個(gè)Id及其他信息,如果系統(tǒng)中多個(gè)表Id都使用這種方式,那么鍵值表中就會(huì)有多條相應(yīng)的規(guī)則記錄;當(dāng)然也可以讓整個(gè)數(shù)據(jù)庫(kù)所有表的Id從都按相同的規(guī)則從一個(gè)源產(chǎn)生,那么鍵值表中只需要一條規(guī)則記錄即可。
下面來(lái)看看這樣一個(gè)使用鍵值表例子的演變(MsSQL):
復(fù)制代碼 代碼如下:

--創(chuàng)建鍵值表
CREATE TABLE KeyTable(
ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
TCode VARCHAR(20) UNIQUE NOT NULL,
TName VARCHAR(50) NOT NULL,
TKey INT NOT NULL,
)
GO
--插入測(cè)試記錄
INSERT INTO KeyTable(TCode,TName,TKey)
VALUES('T001','Test',0)
GO
--創(chuàng)建獲取指定表ID的存儲(chǔ)過(guò)程,也可以修改成函數(shù)
CREATE PROCEDURE UP_NewTableID
@TCode VARCHAR(20),@NextID INT OUTPUT
AS
DECLARE @CurTKey INT,@NextTKey INT
BEGIN TRAN TransID
SELECT @CurTKey=TKey
FROM KeyTable
WHERE TCode = @TCode
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRAN TransID
RAISERROR('Warning: No such row is exists',16,1)
RETURN
END
SET @NextTKey = @CurTKey + 1
--WAITFOR DELAY '00:00:05'
UPDATE KeyTable
SET TKey = @NextTKey
WHERE TCode = @TCode
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRAN TransID
RAISERROR('Warning: No such row is updated',16,1)
RETURN
END
COMMIT TRAN TransID
SET @NextID = @NextTKey
GO

執(zhí)行存儲(chǔ)過(guò)程UP_NewTableID:
復(fù)制代碼 代碼如下:

DECLARE @NextID INT
EXEC UP_NewTableID 'T001',@NextID OUTPUT
PRINT @NextID

運(yùn)行的時(shí)會(huì)發(fā)現(xiàn)很正常,獲取的結(jié)果也很正確。但是如果在高并發(fā)的情況,多個(gè)用戶可能就會(huì)獲取相同的ID,如果獲取的ID后是用于保存對(duì)應(yīng)表中的記錄,那么最多只有一個(gè)用戶能保存成功。
下面模擬一下并發(fā)情形,將上面的存儲(chǔ)過(guò)程UP_NewTableID中語(yǔ)句WAITFOR DELAY '00:00:05'的注釋去掉,打開(kāi)3個(gè)查詢分析器的窗體,依次執(zhí)行上面語(yǔ)句。
預(yù)期是想分別獲得1,2,3,但是也許會(huì)發(fā)現(xiàn)多個(gè)窗體的運(yùn)行結(jié)果都是:1。這就是說(shuō)在更新語(yǔ)句執(zhí)行之前,大家都獲取的ID是0,所以下一個(gè)數(shù)值都是為1。(實(shí)際的數(shù)值,根據(jù)DELAY的參數(shù)大小及運(yùn)行時(shí)間按間隔有關(guān))
從這方面來(lái)分析的話有的朋友可能就會(huì)想到,是否可以在更新語(yǔ)句執(zhí)行時(shí)判斷ID是不是原始ID了?修改過(guò)程:
復(fù)制代碼 代碼如下:

ALTER PROCEDURE UP_NewTableID
@TCode VARCHAR(20),@NextID INT OUTPUT
AS
DECLARE @CurTKey INT,@NextTKey INT
BEGIN TRAN TransID
SELECT @CurTKey=TKey
FROM KeyTable
WHERE TCode=@TCode
IF @@ROWCOUNT=0BEGIN
ROLLBACK TRAN TransID
RAISERROR('Warning: No such row is exists',16,1)
RETURN
END
SET @NextTKey=@CurTKey+1
WAITFOR DELAY '00:00:05'
UPDATE KeyTable
SET TKey=@NextTKey
WHERE TCode=@TCode AND TKey=@CurTKey--此處加上TKey的校驗(yàn)
IF @@ROWCOUNT=0BEGIN
ROLLBACK TRAN TransID
RAISERROR('Warning: No such row is updated',16,1)
RETURN
END
COMMIT TRAN TransID
SET @NextID=@NextTKey
GO

如果打開(kāi)個(gè)3個(gè)執(zhí)行過(guò)程來(lái)模擬并發(fā),那么會(huì)有2個(gè)窗體出現(xiàn):
消息 50000,級(jí)別 16,狀態(tài) 1,過(guò)程 UP_NewTableID,第 28 行
Warning: No such row is updated
由此會(huì)看到還是會(huì)由于并發(fā)導(dǎo)致有用戶操作失敗,但是較上一個(gè)至少將錯(cuò)誤出現(xiàn)的時(shí)間點(diǎn)提前了。
那么有沒(méi)有更好的方法,從查詢到更新結(jié)束整個(gè)事務(wù)過(guò)程中,不會(huì)有任何其他事務(wù)插入其中來(lái)攪局的辦法呢,答案很明確,有,使用鎖!需要選擇適當(dāng)?shù)逆i,否則效果將和上面的一樣。
復(fù)制代碼 代碼如下:

ALTER PROCEDURE UP_NewTableID
@TCode VARCHAR(20),@NextID INT OUTPUT
AS
DECLARE @CurTKey INT,@NextTKey INT
BEGIN TRAN TransID
SELECT @CurTKey=TKey
FROM KeyTable WITH (UPDLOCK)--采用更新鎖,并保持到事務(wù)完成
WHERE TCode=@TCode
IF @@ROWCOUNT=0BEGIN
ROLLBACK TRAN TransID
RAISERROR('Warning: No such row is exists',16,1)
RETURN
END
SET @NextTKey=@CurTKey+1
WAITFOR DELAY '00:00:05'
UPDATE KeyTable
SET TKey=@NextTKey
WHERE TCode=@TCode--此處無(wú)需驗(yàn)證TKey是否與SELECT的相同
COMMIT TRAN TransID
SET @NextID=@NextTKey
GO

可以打開(kāi)N(N>=2)個(gè)窗體來(lái)進(jìn)行測(cè)試,將會(huì)看到所有操作都被串行化,結(jié)果就是我們想要的那樣。如此注釋或者去掉模仿并發(fā)的語(yǔ)句WAITFOR DELAY '00:00:05'即可。
如前面所說(shuō),這同樣適應(yīng)于單據(jù)編號(hào)類似編碼的產(chǎn)生形式,只要對(duì)前面的代碼及鍵值表稍作修改即可,有興趣的朋友可以一試。如果是從前端取得這個(gè)編號(hào),并應(yīng)用于各個(gè)記錄,那么可能存在跳號(hào)的可能。如果為了保證不存在跳號(hào),一種解決方案就是使用跳號(hào)表,將跳號(hào)記錄定期掃描并應(yīng)用于其他記錄。另一種解決方案是將記錄的保存操作放置到編號(hào)產(chǎn)生的過(guò)程中,形成一個(gè)串行化的事務(wù)。

俗話說(shuō)蘿卜白菜各有所愛(ài),您用哪一種自有你的道理。
您可能感興趣的文章:
  • mysql主鍵id的生成方式(自增、唯一不規(guī)則)

標(biāo)簽:新余 中衛(wèi) 貸款群呼 黃山 金昌 濟(jì)寧 宜春 河源

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)》,本文關(guān)鍵詞  sqlserver,數(shù)據(jù)庫(kù),主鍵,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久91精品国产91久久小草| 99久久国产综合精品色伊| 94色蜜桃网一区二区三区| 欧美麻豆精品久久久久久| 中文字幕中文字幕一区| 紧缚奴在线一区二区三区| 欧美综合欧美视频| 一区二区三区日韩精品视频| 国产福利91精品一区二区三区| 一本大道久久a久久综合| 国产91富婆露脸刺激对白| 国产人成亚洲第一网站在线播放| 无码av免费一区二区三区试看| 粉嫩一区二区三区性色av| 久久众筹精品私拍模特| 狠狠网亚洲精品| 成人免费福利片| 丁香六月综合激情| 精品捆绑美女sm三区| 亚洲国产精品久久久久婷婷884| 成人一级视频在线观看| 最新不卡av在线| 一本久久综合亚洲鲁鲁五月天 | 国产 欧美在线| 欧美精彩视频一区二区三区| 粉嫩蜜臀av国产精品网站| 中文字幕中文字幕中文字幕亚洲无线 | 韩国理伦片一区二区三区在线播放| 欧美男男青年gay1069videost | 亚洲精品在线观看网站| 国产做a爰片久久毛片| 国产精品美日韩| 欧美日精品一区视频| 九一九一国产精品| 久久久影视传媒| 欧美日韩一区在线| 国产精品一区专区| 亚洲另类春色国产| 国产无一区二区| 欧美日韩一区二区三区不卡| 捆绑调教美女网站视频一区| 久久噜噜亚洲综合| 在线视频一区二区三| 成人午夜伦理影院| 久久国产成人午夜av影院| 国产精品成人免费精品自在线观看 | 欧美在线免费观看视频| 精品在线播放免费| 亚洲午夜激情网站| 中文字幕一区二区三区视频 | 91精品1区2区| 国产91在线观看丝袜| 久久99国产精品免费| 天天射综合影视| 亚洲国产日韩精品| 国产性天天综合网| www一区二区| 久久综合久久综合亚洲| 精品久久人人做人人爱| 91精品国模一区二区三区| 欧美性大战久久久久久久| 91视频免费观看| 97se亚洲国产综合自在线| 国产成人精品免费网站| 成人国产精品免费观看视频| 国内成+人亚洲+欧美+综合在线| 青草av.久久免费一区| 裸体健美xxxx欧美裸体表演| 蜜乳av一区二区| 国产在线精品国自产拍免费| 国产一区二区三区在线观看免费| 成人h精品动漫一区二区三区| 国产欧美日韩精品a在线观看| 日韩成人免费看| 国产精品网站在线播放| 亚洲视频在线观看三级| 中文字幕日本乱码精品影院| 亚洲综合视频在线| 美女尤物国产一区| 国产剧情在线观看一区二区| 成人午夜视频在线| 欧美日韩一本到| 国产午夜亚洲精品理论片色戒| 中文字幕五月欧美| 天天亚洲美女在线视频| 国产一区二区在线电影| 欧美性色综合网| www激情久久| 日本aⅴ亚洲精品中文乱码| 国产a级毛片一区| 日韩一级黄色大片| 亚洲欧美日韩在线播放| 激情小说欧美图片| 欧美性生活一区| 亚洲欧洲日韩一区二区三区| 国产伦精品一区二区三区免费| 欧美三级韩国三级日本三斤| 欧美极品少妇xxxxⅹ高跟鞋 | 91在线免费看| 2021中文字幕一区亚洲| 五月天一区二区| 成人综合婷婷国产精品久久蜜臀| 欧美在线一二三| 亚洲视频一区二区在线| 黄色成人免费在线| 91精品国产全国免费观看| 一区二区三区四区五区视频在线观看| 激情六月婷婷久久| 久久久国产一区二区三区四区小说| 亚洲欧美日韩一区| 99久久99久久久精品齐齐| 欧美电视剧免费全集观看| 亚洲欧美日韩国产一区二区三区| 国产不卡在线播放| 久久精品欧美日韩精品| 麻豆精品视频在线| 91精品蜜臀在线一区尤物| 亚洲女人****多毛耸耸8| 欧美日韩一级视频| 亚洲mv大片欧洲mv大片精品| 欧美少妇性性性| 亚洲国产毛片aaaaa无费看| av在线不卡网| 亚洲欧洲日产国码二区| 色综合久久久久综合99| 亚洲人成在线播放网站岛国| www.久久久久久久久| 午夜激情久久久| 欧美一二三在线| 国产麻豆日韩欧美久久| 久久久91精品国产一区二区精品| 黄页网站大全一区二区| 亚洲免费视频成人| 在线观看免费视频综合| 亚洲乱码日产精品bd| 在线成人av影院| 成人国产精品免费观看动漫| 亚洲激情欧美激情| 欧美亚州韩日在线看免费版国语版| 日韩欧美中文字幕制服| 九色综合狠狠综合久久| 一级精品视频在线观看宜春院 | 欧美精品在线视频| 国产成人av电影在线播放| 亚洲精品视频一区| 国产精品天美传媒沈樵| 欧美日韩视频在线第一区 | 久久综合中文字幕| 欧美色涩在线第一页| 91在线码无精品| 国产精品456| 久久99精品国产麻豆不卡| 奇米精品一区二区三区四区 | 五月婷婷激情综合网| 欧美韩国日本不卡| 日韩一区二区三区免费看 | 中文字幕一区二区三区四区| 色视频欧美一区二区三区| 久久成人免费日本黄色| 一区二区视频在线看| 亚洲欧美激情插| |精品福利一区二区三区| 欧美高清在线一区| 日韩三级视频中文字幕| 欧美电影免费观看高清完整版在线| 91精品福利视频| 精品视频一区 二区 三区| 99视频国产精品| 99精品在线观看视频| 韩国v欧美v亚洲v日本v| 国产成人精品一区二区三区四区 | 国产偷国产偷亚洲高清人白洁| 精品国产区一区| 久久久久久电影| 久久久久久久综合| 中文字幕一区不卡| 久久成人麻豆午夜电影| 国产乱码精品一品二品| av在线不卡观看免费观看| 91福利小视频| 久久综合网色—综合色88| 精品国产乱码久久久久久图片| 91精品国产免费| 国产午夜精品理论片a级大结局| 久久久久久久av麻豆果冻| 亚洲成在线观看| 国产综合久久久久久鬼色| 91在线视频网址| 91精品国产aⅴ一区二区| 亚洲免费观看在线视频| 蜜臀av一区二区| 成人福利电影精品一区二区在线观看 | 972aa.com艺术欧美| 色爱区综合激月婷婷| 精品福利av导航| 夜夜操天天操亚洲| 91成人看片片| 日韩一级成人av| 亚洲国产精品久久久久婷婷884| 成人污视频在线观看|