1. 程式人生 > >MSSQL,ORACLE,DB2,MYSQL,Access各類資料庫使用GUID作為主鍵

MSSQL,ORACLE,DB2,MYSQL,Access各類資料庫使用GUID作為主鍵

不同的資料庫生成GUID的方式不同,當然可以統一用程式來寫,比如最後的c++生成guid的方式,但是有時候用資料庫自帶的方法,可以更簡便。
  • 什麼是GUID?

    GUID: 即Globally Unique Identifier(全球唯一識別符號) ,GUID是一個通過特定演算法產生的二進位制長度為128位的數字識別符號,用於指示產品的唯一性。GUID 主要用於在擁有多個節點、多臺計算機的網路或系統中,分配必須具有唯一性的識別符號。 簡單的計算方法 網絡卡mac地址+CPU當前時鐘 按照指定演算法計算。(來自百度百科)

  • 使用GUID作為主鍵的好處及缺點。

優點:絕對不會重複,在資料合併、資料遷移時不會出現主鍵衝突的問題,對於大型系統,可能需要進行資料遷移的系統,建議使用GUID。便於資料庫初始化,如果應用程式要載入一些初始資料, IDENTITY 列的處理方式就比較麻煩,而 GUID列則無需任何處理,直接用 T-SQL 載入即可。

缺點1:

可讀性差,比如說你需要在後臺修改一個商品,你如果自增長欄位那麼你只需在前臺找出ID,比如1,再到後臺找到這記錄手動修改就好了,而你使用GUID,那麼你想想拿這麼一大串字元去找資料什麼情形 ?

缺點2:儲存空間增大;索引時間較慢所以大資料量查詢時對效能影響較大。在部落格園某位博主10W資料量測試下,比int的主鍵慢1S左右,增加索引列可減小效能影響。

  • MSSQL獲取GUID

如果在 SQL Server 的表定義中將列型別指定為 uniqueidentifier,則列的值就為 GUID 型別。使用NewID() 函式可以產生 GUID 唯一值。

不過阿布建議你這列適用varchar型別,生成GUID後轉成varchar型別,並去除中間的“-” 方便以後判斷及處理。

  • ORACLE獲取GUID的函式

    在Oracle中可以用SYS_GUID()來生成一個guid,相當於msSql中的newid()。在Oracle9i和Oracle 10g 裡SYS_GUID產生得到的資料是32 位的。

  • DB2獲取GUID的函式

    DB2中,沒有產生GUID的函式。

想使用GUID有兩種方法:

1:替代函式generate_unique,返回的資料型別為CHAR   FOR   BIT,長度為13。

2:程式中產生GUID然後再儲存到資料庫。後續我將介紹程式中產生GUID的方法。

  • MYSQL獲取GUID的函式

    mysql好像不支援GUID的自動生成,也可以使用字元欄位儲存,程式生成GUID的方式。

  • C#中生成GUID

System.Guid.NewGuid().ToString();

  • VB.NET中生成GUID

Module BuilderExamples
Sub Main()
GenerateGUID()
End Sub
Public Sub GenerateGUID()
Console.WriteLine(“GUID: ” + System.Guid.NewGuid().ToString())
End Sub
End Module

  • java中生成GUID

private void getRandomGUID(boolean secure)
{
MessageDigest md5 = null;
StringBuffer sbValueBeforeMD5 = new StringBuffer(128);

try
{
md5 = MessageDigest.getInstance(“MD5″);
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}

try
{
long time = System.currentTimeMillis();
long rand = secure ? mySecureRand.nextLong() : myRand.nextLong();
sbValueBeforeMD5.append(s_id);
sbValueBeforeMD5.append(“:”);
sbValueBeforeMD5.append(Long.toString(time));
sbValueBeforeMD5.append(“:”);
sbValueBeforeMD5.append(Long.toString(rand));

valueBeforeMD5 = sbValueBeforeMD5.toString();
md5.update(valueBeforeMD5.getBytes());

byte[] array = md5.digest();
StringBuffer sb = new StringBuffer(32);
for (int j = 0; j < array.length; ++j)
{
int b = array[j] & TWO_BYTES;
if (b < PAD_BELOW)
{
sb.append(’0′);
}
sb.append(Integer.toHexString(b));
}

valueAfterMD5 = sb.toString();

}
catch (Exception e)
{
e.printStackTrace();
}
}

  • C++中生成GUID

CString get_strGUID()
{
GUID   m_guid;
CString   strGUID;
if   (S_OK ==::CoCreateGuid(&m_guid))
{
strGUID.Format(“%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X” ,
m_guid.Data1,  m_guid.Data2,   m_guid.Data3 ,
m_guid.Data4[0],   m_guid.Data4[1],
m_guid.Data4[2],   m_guid.Data4[3],
m_guid.Data4[4],   m_guid.Data4[5],
m_guid.Data4[6],   m_guid.Data4[7] );
}

return strGUID;
}

  • PHP中生成GUID

function create_guid() {
$charid = strtoupper(md5(uniqid(mt_rand(), true)));
$hyphen = chr(45);// “-”
$uuid = chr(123)// “{”
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// “}”
return $uuid;
}