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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值