數據庫主鍵UUID生成方式

UUID:全局唯一標識符 (GUID)。爲什麼採用這種主鍵生成方式?因爲是全局唯一,當需要將一張表的數據導入到另外一張表時,避免存在主鍵衝突。

當然,guid並不是完美的。guid缺點也非常明顯:

1.GUID 值較長,不容易記憶和輸入,而且這個值是隨機、無順序的,所以使用時要注意場合。

2.GUID 的值有 16 個字節,與其它那些諸如 4 字節的整數相比要相對大一些。這意味着如果在數據庫中使用 uniqueidentifier 鍵,可能會帶來兩方面的消極影響:存儲空間增大;索引時間較慢。



下面是本人收集的部分guid的使用方式。如有建議或錯誤,可以留言。

1,由程序自動生成

C++

#include <objbase.h>
#include <stdio.h>
//--生成GUID
const char* newGUID()
{
static char buf[64] = {0};
GUID guid;
if (S_OK == ::CoCreateGuid(&guid))
{
_snprintf(buf, sizeof(buf)
, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}"
, guid.Data1
, guid.Data2
, guid.Data3
, guid.Data4[0], guid.Data4[1]
, guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
, guid.Data4[6], guid.Data4[7]
);
}
return (const char*)buf;
}
int main(int argc, char* argv[])
{
//--COM
CoInitialize(NULL);
printf(newGUID());
printf("\n");
//--COM
CoUninitialize();
return 0;
}

C#

using System;
namespace GUID測試
  {
  class Program
  {
  static void Main(string[] args)
  {
  Console.WriteLine(System.Guid.NewGuid());
  Console.ReadKey();
  }
  }
  }

Java

import java.util.UUID;
public class guid {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
UUID uuid = UUID.randomUUID();
System.out.println(".{"+uuid.toString()+"}");
}
}

2.由數據庫生成(只列了當前主流的數據庫 oracle/sql-server/mysql)

oracle

 

select sys_guid() from dual;
 
數據類型是 raw(16) 有32個字符。
 

sql-server

 

在sql-serer中,有一個數據類型叫做uniqueidentifier,我們把數據類型指定爲這個,系統自動爲這個列填充默認值newid()。

select newid();

 

mysql

 

select uuid();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章