比如,連續(xù)生成的編號(hào),由于某種操作(通常為刪除)后,產(chǎn)生不連續(xù)的編號(hào),我們將這種不連續(xù)的編號(hào)稱為斷號(hào)。
斷號(hào):比如,連續(xù)生成的編號(hào),由于某種操作(通常為刪除)后,產(chǎn)生不連續(xù)的編號(hào),我們將這種不連續(xù)的編號(hào)稱為斷號(hào)。 例如,數(shù)據(jù)庫(kù)中有一個(gè)字段叫合同編號(hào),正常格式為201106_011(表示2011年6月的第11個(gè)合同),那么它前面的一個(gè)合同編號(hào)應(yīng)該為201106_10,后面的一個(gè)應(yīng)該為201106_12,當(dāng)我們刪除了合同201106_011,就會(huì)出現(xiàn)201106_010后面直接是201106_012,這種情況下叫做斷號(hào)。 傳統(tǒng)系統(tǒng)中,像這種斷號(hào)的情況很常見(jiàn),比如數(shù)據(jù)庫(kù)中的列為遞增類型,當(dāng)刪除某行后,就會(huì)出現(xiàn)斷號(hào),而經(jīng)常有客戶提出需求,不希望出現(xiàn)斷號(hào)的情況。解決方案通常就是,如果刪除了某行數(shù)據(jù),那么下次新增時(shí),應(yīng)該將斷號(hào)補(bǔ)齊。 問(wèn)題很簡(jiǎn)單,解決方法也很簡(jiǎn)單: 寫(xiě)一個(gè)C#方法,用來(lái)獲取下一條記錄的編號(hào):
代碼如下:
public static int GetNextNumber(int[] iNumList)
{
int iTempStr = iNumList[0]; //用一個(gè)臨時(shí)變量保存上一條記錄的編號(hào)
for (var i = 0; i {
if (i == 0)
{
iTempStr = iNumList[i];
}
//如果出現(xiàn)斷號(hào),則補(bǔ)齊斷號(hào)
if ((iNumList[i] – iTempStr) > 1)
{
return iTempStr + 1;
}
else
{
iTempStr = iNumList[i];
}
continue;
}
return iNumList[iNumList.Length – 1] + 1;
}
當(dāng)然,這段代碼也可以簡(jiǎn)寫(xiě)為以下形式:
代碼如下:
public static int GetNextNumber3(int[] iNumList)
{
for (int i = 0, j = 1; j {
//如果出現(xiàn)斷號(hào),則補(bǔ)齊斷號(hào)
if ((iNumList[j] – iNumList[i]) > 1)
{
return iNumList[i] + 1;
}
}
return iNumList[iNumList.Length – 1] + 1;
}
測(cè)試代碼如下:
代碼如下:
static void Main(string[] args)
{
int[] iNums = { 1, 2, 4, 5, 6, 9, 10 }; //刪除了數(shù)組中的3,7,8,即3,7,8為斷號(hào),下次新增時(shí),希望產(chǎn)生的斷號(hào)為3
System.Console.WriteLine(BreakNumber.GetNextNumber3(iNums));
System.Console.WriteLine(BreakNumber.GetNextNumber(iNums));
}
運(yùn)行結(jié)果如下: 代碼如下:
CREATE TABLE testTable
(
Code int primary key
)
INSERT INTO testTable(Code) VALUES (1)
INSERT INTO testTable(Code) VALUES (2)
INSERT INTO testTable(Code) VALUES (3)
INSERT INTO testTable(Code) VALUES (4)
INSERT INTO testTable(Code) VALUES (5)
INSERT INTO testTable(Code) VALUES (6)
INSERT INTO testTable(Code) VALUES (7)
INSERT INTO testTable(Code) VALUES (8)
INSERT INTO testTable(Code) VALUES (9)
INSERT INTO testTable(Code) VALUES (10)
然后再同樣刪除第3、7、8行的數(shù)據(jù),使這三行產(chǎn)生斷號(hào):
DELETE FROM testTable WHERE Code in (3,7,8)
分析:要產(chǎn)生連號(hào),即是要讓Code這一列上連續(xù)的,也就是說(shuō)每每?jī)尚兄g的Code相差為1
由于Code是從1開(kāi)始的(從其他數(shù)字開(kāi)始的也是同理計(jì)算),即按Code從小到大排序號(hào),Code為1的行應(yīng)該為第一行,Code為10的行應(yīng)該在第10行,即Code=行號(hào),
既然這樣,預(yù)覽數(shù)據(jù)如下:
刪除數(shù)據(jù)前的排號(hào):