2011-07-31 52 views
2

你們用於生成唯一帳號的用途是什麼? 一些使用Autoinc字段,其他的東西... 什麼是適當的方式,即在運行插入查詢之前獲取帳號?我應該如何創建獨特的賬單/賬號?

+6

你會使用這個帳號?你會將它公開給客戶,後臺,其他系統嗎?如果是這樣,那麼他們對這個數字的要求是什麼? –

+0

你正在使用什麼DBMS(數據庫)? –

+0

答案也將取決於分配的位置:服務器端與客戶端問題。 – menjaraz

回答

4

你還沒有告訴我們您所使用的數據庫系統,但是從它的聲音,你在談論德爾福的Paradox表格。如果是這樣,一個autoInc列可以工作,但如果我沒有記錯,使用Paradox autoInc列移動數據時必須非常小心,因爲它們在移動時從零重新生成。如上所述,您可以使用GUID - sysutils.function CreateGUID(out Guid:TGUID):HResult; - 它們將永遠是唯一的,但GUIDS的缺點是,按這些鍵排序並不直觀,可能沒有意義,所以您需要某種時間戳列來維護插入的順序,這可以重要。另外,一個GUID是一個相當長的字符串,對於用作帳號#來說效率並不高,這個帳號在很多表中都是主鍵或外鍵。

所以如果你想自動獲取某些東西,我會堅持使用autoInc,但是如果你必須移動數據,並且需要保留原始鍵,請將原始autoincs作爲整數列加載到新位置,否則最終會破壞整個數據庫。 (我相信還有其他一些情況也會導致autoIncs在Paradox表中重置 - 如果相關的話,研究此問題 - 從我使用Pdox開始已經很長時間了,並且這對其他平面文件數據庫可能不會有問題)

如果您的確在使用數據庫服務器--SQLServer,Oracle,Interbase等,它們都具有autoInc/indentity或generator功能,有時與觸發器結合使用 - 這是您的最佳選擇。

如果你想在Delphi代碼中自己處理這個問題,Dorin的答案也是一個很好的解決方案。創建一個全局的線程安全函數來實現它 - 這將確保非常高的安全級別。

HTH

8

如果您使用的是SQL數據庫,請使用Generator。如果你想使用一個獨立的機制,你可以考慮使用一個GUID。

-1

我用這個PHP代碼片段來產生一個像樣的帳號:

$account_number = str_replace(array("0","O"),"D",strtoupper(substr(md5(time()),0,7))); 

這將創建一個不包含0或O公司(以避免在手機上的錯誤或抄寫他們一個7位數的varchar字符串電子郵件等)你得到像EDB6DA6或76337D5或DB2E624的東西。

+0

-1-對不起,但我必須投票,因爲問題顯然是標記爲Delphi,而不是PHP。 – Vector

+2

@Mikey:我不會那麼快就駁回其他語言的解決方案。特別是當它是這樣一個簡單的片段。它的功能/含義很容易確定,並很容易轉換爲Delphi。 –

+1

@marjan - 以$開頭的變量的視線讓我奇怪地行動 - 大聲笑...... Dorin將它翻譯成Delphi,並且我贊成這篇文章。 – Vector

2

根據您需要的數量多長時間,你可以用Jamies MD5變換去還是:

var 
    LDateTime: TDateTime; 
    LBytes: array[0..7] of Byte absolute LDateTime; 
    LAccNo: string; 
    Index: Integer; 
begin 
    LDateTime := Now; 
    LAccNo := EmptyStr; 
    for Index := 0 to 7 do 
    LAccNo := LAccNo + IntToHex(LBytes[ Index ], 2); 
    // now you have a code in LAccNo, use it wisely (: 
end; 
+0

你的建議叫做'race' :) –

+0

@Downvoter我不知道我是否明白你想說什麼,你能改說嗎? – ComputerSaysNo

+0

結果編號根本不是唯一的。 –