如何在sql中guid用法自动生成guid-CSDN论坛

2005年7月 荣获微软MVP称号2008年7月 荣获微软MVP称号2007年7月 荣获微软MVP称号2006年7月 荣获微软MVP称号
2004年5月 .NET技术大版内专家分月排行榜第二2004年4月 .NET技术大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。2012年9月 MS-SQL Server大版内专家分月排行榜第三
2011年8月 总版技术专家分月排行榜第二2011年7月 总版技术专家分月排行榜第二
2012年7月 荣获微软MVP称号
2012年9月 MS-SQL Server大版内专家分月排行榜第三
2011年8月 总版技术专家分月排行榜第二2011年7月 总版技术专家分月排行榜第二
2012年7月 荣获微软MVP称号
2012年9月 MS-SQL Server大版内专家分月排行榜第三
2011年8月 总版技术专家分月排行榜第二2011年7月 总版技术专家分月排行榜第二
2012年7月 荣获微软MVP称号
本帖子已过去太久远了,不再提供回复功能。2013年4月 MS-SQL Server大版内专家分月排行榜第二
2012年5月 MS-SQL Server大版内专家分月排行榜第三
2009年8月 MS-SQL Server大版内专家分月排行榜第一2009年7月 MS-SQL Server大版内专家分月排行榜第一
2010年8月 其他数据库开发大版内专家分月排行榜第二
2010年7月 总版技术专家分月排行榜第二2010年6月 总版技术专家分月排行榜第二
2010年5月 总版技术专家分月排行榜第三
2010年7月 总版技术专家分月排行榜第二2010年6月 总版技术专家分月排行榜第二
2010年5月 总版技术专家分月排行榜第三
2014年4月 Delphi大版内专家分月排行榜第三2014年3月 Delphi大版内专家分月排行榜第三2013年5月 Delphi大版内专家分月排行榜第三2013年1月 Delphi大版内专家分月排行榜第三2010年11月 Delphi大版内专家分月排行榜第三2009年12月 Delphi大版内专家分月排行榜第三2009年11月 Delphi大版内专家分月排行榜第三
2014年4月 Delphi大版内专家分月排行榜第三2014年3月 Delphi大版内专家分月排行榜第三2013年5月 Delphi大版内专家分月排行榜第三2013年1月 Delphi大版内专家分月排行榜第三2010年11月 Delphi大版内专家分月排行榜第三2009年12月 Delphi大版内专家分月排行榜第三2009年11月 Delphi大版内专家分月排行榜第三
2010年7月 总版技术专家分月排行榜第二2010年6月 总版技术专家分月排行榜第二
2010年5月 总版技术专家分月排行榜第三
2011年3月 Web 开发大版内专家分月排行榜第二2011年1月 Web 开发大版内专家分月排行榜第二2010年10月 Web 开发大版内专家分月排行榜第二2010年9月 Web 开发大版内专家分月排行榜第二2010年6月 Web 开发大版内专家分月排行榜第二
2012年10月 Web 开发大版内专家分月排行榜第三2010年7月 Web 开发大版内专家分月排行榜第三
2016年10月优秀大版主2016年8月论坛优秀版主2015年4月优秀版主2014年11月论坛优秀版主
2016年4月 荣获微软MVP称号2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号2013年4月 荣获微软MVP称号2009年1月 荣获微软MVP称号2012年4月 荣获微软MVP称号2011年4月 荣获微软MVP称号2010年4月 荣获微软MVP称号
2016年4月荣获微软MVP荣誉称号2015年4月荣获微软MVP称号2014年4月 荣获微软MVP称号
2016年7月 MS-SQL Server大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。收集几种生成顺序GUID的方法 - CSDN博客
收集几种生成顺序GUID的方法

public static class Generator
&&&&&&& [DllImport(&rpcrt4.dll&, SetLastError = true)]
&&&&&&& public static extern int UuidCreateSequential(out Guid guid);
&&&&&&& private const int RPC_S_OK = 0;
&&&&&&& public static Guid CreateRpcrt4Guid()
&&&&&&&&&&& G
&&&&&&&&&&& int result = UuidCreateSequential(out guid);
&&&&&&&&&&& if (result == RPC_S_OK)
&&&&&&&&&&&&&&&
&&&&&&&&&&& else
&&&&&&&&&&&&&&& return Guid.NewGuid();
&&&&&&& public static Guid CreateSecuentialGuid()
&&&&&&&&&&& byte[] uid = Guid.NewGuid().ToByteArray();
&&&&&&&&&&& byte[] binDate = BitConverter.GetBytes(DateTime.UtcNow.Ticks);
&&&&&&&&&&& byte[] secuentialGuid = new byte[uid.Length];
&&&&&&&&&&& secuentialGuid[0] = uid[0];
&&&&&&&&&&& secuentialGuid[1] = uid[1];
&&&&&&&&&&& secuentialGuid[2] = uid[2];
&&&&&&&&&&& secuentialGuid[3] = uid[3];
&&&&&&&&&&& secuentialGuid[4] = uid[4];
&&&&&&&&&&& secuentialGuid[5] = uid[5];
&&&&&&&&&&& secuentialGuid[6] = uid[6];
&&&&&&&&&&& // set the first part of the 8th byte to '1100' so&&&&
&&&&&&&&&&& // later we'll be able to validate it was generated by us&&
&&&&&&&&&&& secuentialGuid[7] = (byte)(0xc0 | (0xf & uid[7]));
&&&&&&&&&&& // the last 8 bytes are sequential,&&&
&&&&&&&&&&& // it minimizes index fragmentation&&
&&&&&&&&&&& // to a degree as long as there are not a large&&&
&&&&&&&&&&& // number of Secuential-Guids generated per millisecond&
&&&&&&&&&&& secuentialGuid[9] = binDate[0];
&&&&&&&&&&& secuentialGuid[8] = binDate[1];
&&&&&&&&&&& secuentialGuid[15] = binDate[2];
&&&&&&&&&&& secuentialGuid[14] = binDate[3];
&&&&&&&&&&& secuentialGuid[13] = binDate[4];
&&&&&&&&&&& secuentialGuid[12] = binDate[5];
&&&&&&&&&&& secuentialGuid[11] = binDate[6];
&&&&&&&&&&& secuentialGuid[10] = binDate[7];
&&&&&&&&&&& return new Guid(secuentialGuid);
&&&&&&& public static Guid CreateCombGuid()
&&&&&&&&&&& byte[] guidArray = Guid.NewGuid().ToByteArray();
&&&&&&&&&&& DateTime baseDate = new DateTime();
&&&&&&&&&&& DateTime now = DateTime.N
&&&&&&&&&&& // Get the days and milliseconds which will be used to build the byte string
&&&&&&&&&&& TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
&&&&&&&&&&& TimeSpan msecs = now.TimeOfD
&&&&&&&&&&& // Convert to a byte array
&&&&&&&&&&& // Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333
&&&&&&&&&&& byte[] daysArray = BitConverter.GetBytes(days.Days);
&&&&&&&&&&& byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));
&&&&&&&&&&& // Reverse the bytes to match SQL Servers ordering
&&&&&&&&&&& Array.Reverse(daysArray);
&&&&&&&&&&& Array.Reverse(msecsArray);
&&&&&&&&&&& // Copy the bytes into the guid
&&&&&&&&&&& Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
&&&&&&&&&&& Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);
&&&&&&&&&&& return new Guid(guidArray);
每种方法只生成10条记录,结果如下
Secuential:
f8373adb-cf34-11e2-be8d-d43d7e333b2c
f8373adc-cf34-11e2-be8d-d43d7e333b2c
f8373add-cf34-11e2-be8d-d43d7e333b2c
f8373ade-cf34-11e2-be8d-d43d7e333b2c
f8373adf-cf34-11e2-be8d-d43d7e333b2c
f8373ae0-cf34-11e2-be8d-d43d7e333b2c
f8373ae1-cf34-11e2-be8d-d43d7e333b2c
f8373ae2-cf34-11e2-be8d-d43d7e333b2c
f8373ae3-cf34-11e2-be8d-d43d7e333b2c
f8373ae4-cf34-11e2-be8d-d43d7e333b2c
e8edcc23-9c22-c3b1-04d1-08d07e5fad6c
15c-c379-04d1-08d07e5fad6c
a4abcb36-71e9-c2a2-04d1-08d07e5fad6c
bb03c46a-ab7a-ca27-04d1-08d07e5fad6c
e4b7b99e-2a8f-cb0a-04d1-08d07e5fad6c
26ac-ca22-04d1-08d07e5fad6c
423a83c7-633a-c98c-04d1-08d07e5fad6c
f2480bdb-d1-08d07e5fad6c
3b76a6dc-8534-cd29-04d1-08d07e5fad6c
e12fbfe7-dc1f-c57b-04d1-08d07e5fad6c
65d8b46f-ea29-41f8-af76-a1d600e29f85
2c95c4c2-aca4-46de-b842-a1d600e29f85
c6f054ea-dbb4-432c-aed3-a1d600e29f85
2b47c23c-ac18-467c-8c2d-a1d600e29f85
4dbe1536-ccb1-4fc4-b145-a1d600e29f85
cccd4c08-6c52-4b12-90fc-a1d600e29f85
f6f07bde--e29f85
921a018f-c99-a1d600e29f85
fbc560a3-acbe-48da-9b06-a1d600e29f85
bbfbbe7f-2bc6-4bd7-bbae-a1d600e29f85
单从结果上看,第一种使用起来更方便些.
但这种方法有一个问题,就是在SQL SERVER中排序还是会乱,所以在需要排序的时候,需要对这种生成方式进行简单处理,增加一点代码
byte[] guidBytes = guid.ToByteArray();
Array.Reverse(guidBytes, 0, 4);
Array.Reverse(guidBytes, 4, 2);
Array.Reverse(guidBytes, 6, 2);
&最终代码变为:
public static Guid CreateRpcrt4Guid()
int result = UuidCreateSequential(out guid);
if (result == RPC_S_OK)
byte[] guidBytes = guid.ToByteArray();
Array.Reverse(guidBytes, 0, 4);
Array.Reverse(guidBytes, 4, 2);
Array.Reverse(guidBytes, 6, 2);
return new Guid(guidBytes);
return Guid.NewGuid();
本文已收录于以下专栏:
相关文章推荐
转自:在C#中生成唯一的字符串和数字 /lcwzj/archive//1436992.html 
/// Guid t...
你有过生成不重复编号的想法吗?比如做一个自动保存网页图片的工具,要保证保存的图片不互相覆盖,一个想法是使用一个计数器从1开始递增,但是这样还有问题,比如我们无法保证磁盘中以前没有可能造成重复的图片文件...
在C#中GUID生成的四种格式
var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd48...
java提供类java.util.UUID;来产生UUID
GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生个GUID,则可以保证(概率意义...
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能...
pb9生成guid的方法
( 12:35:11)
全球唯一识别码
参考:/icejoywoo/archive//2724674.html
1、信号量Sephmore
public class Syn...
/html/sysadmin/79.html
现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量...
(1)用代理方法调用title时,只有当上面的视图控制器或者导航控制器用.title方法赋值,才能被调用。否则返回值是Null。
(2)而用initWithTitle方法赋值的都是给.tabBarIt...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)(转帖)使用 GUID 值来作为数据库行标识
- CSDN博客
(转帖)使用 GUID 值来作为数据库行标识
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值。
GUID 的格式为&xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。
在这次开发 ASP.NET 应用时,我大量使用了类型为 GUID 的 ID 列作为各实体表的关键字(键)。由于其唯一、易产生的特性,给应用程序处理带来诸多好处。
1、在 SQL Server 中使用 GUID
如果在 SQL Server 的表定义中将列类型指定为 uniqueidentifier,则列的值就为 GUID 类型。
SQL Server 中的 NewID() 函数可以产生 GUID 唯一值,使用此函数的几种方式如下:
1) 作为列默认值
将 uniqueidentifier 的列的默认值设为 NewID(),这样当新行插入表中时,会自动生成此列 GUID 值。2)使用 T-SQL
在 T-SQL 中使用 NewID()函数,如&INSERT INTO Table(ID,... ) VALUES(NewID(),...)&来生成此列的 GUID 值。
3)提前获取 GUID 值
由于特殊功能需要,需要预先获知新行的 ID 值,也可以使用如下 C# 代码提前获得 GUID 的值,再存储到数据库中:
&SqlCommand cmd = New SqlCommand();&mandText = &SELECT NewID()&;&string rowID = (string) cmd.ExecuteScalar();&mandText = &INSERT INTO Table(ID,...) VALUES(@ID,...)&cmd.Parameters.Add(&@ID&,SqlDbType.UniqueIdentifier).Value = new Guid(rowID);&cmd.ExecuteNoQuery();
uniqueidentifier 值不能进行算术运算,但可以进行(意义不大的)比较操作和 NULL 检查;它不能象 IDENTITY 列一样,可以获知每行的增加时间的先后顺序,只能通过增加其它时间或时间戳列来完成此功能。
2、在 .NET 中使用 GUID
GUID 在 .NET 中使用非常广泛,而且 .NET Framework 提供了专门 Guid 基础结构。
Guid 结构的常用法包括:
1) Guid.NewGUID()
生成一个新的 GUID 唯一值
2) Guid.ToString()
将 GUID 值转换成字符串,便于处理
3)构造函数 Guid(string)
由 string 生成 Guid 结构,其中string 可以为大写,也可以为小写,可以包含两端的定界符&{}&或&()&,甚至可以省略中间的&-&,Guid 结构的构造函数有很多,其它构造用法并不常用。
同时,为了适用数据库中使用 GUID 的需要,.NET Framework 也提供了 SqlGUID 结构,它和 Guid 结构类似,只是两者对排序(CompareTo)的处理方式不同,SqlGuid 计算值的最后 6 个字节。而 Guid 计算全部 16 个字节,这种差异可能会给 SQL Server 中 uniqueidentifier 列的排序带来一定影响,当然这种排序意义也不大。
.NET Framework 中可以使用类 GuidConverter 提供将 Guid 结构与各种其他表示形式相互转换的类型转换器。
3、GUID 的优缺点
同 IDENTITY 列相比,uniqueidentifier 列可以通过 NewID() 函数提前得知新增加的行 ID,为应用程序的后续处理提供了很大方便。
便于数据库移植,其它数据库中并不一定具有 IDENTITY 列,而 Guid 列可以作为字符型列转换到其它数据库中,同时将应用程序中产生的 GUID 值存入数据库,它不会对原有数据带来影响。
便于数据库初始化,如果应用程序要加载一些初始数据, IDENTITY 列的处理方式就比较麻烦,而 uniqueidentifier 列则无需任何处理,直接用 T-SQL 加载即可。
便于对某些对象或常量进行永久标识,如类的 ClassID,对象的实例标识,UDDI 中的联系人、服务接口、tModel标识定义等。
GUID 值较长,不容易记忆和输入,而且这个值是随机、无顺序的,所以使用时要注意场合,最好不要尝试用它来作为你的电子邮件地址
GUID 的值有 16 个字节,与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键,可能会带来两方面的消极影响:存储空间增大;索引时间较慢。
综合来说, GUID 的优点带来的便利远超出其缺点带来的影响,随着诸如 WebService 等系统互联与整合技术的不断发展,其唯一标识的特性使得其应用越来越广,在您的应用程序中也应考虑使用它了。
Windows 2000之后已经不使用网卡地址作为生成GUID的参数了,现在用的是第四代算法,使用的是安全子系统的随机数生成器(RNG),因此安全性没有什么问题了。 如果没有网卡,系统会使用其它的一些具有随机特征的数字作为种子来生成GUID。 GUID 主要用在需要永久的,保持唯一的,固定长度的标识上。 例如,想在网站上发布新闻,用 news.asp?id=GUID 就可以很好地保持唯一性,如果用整数的话,会越来越大,不便于管理,而且易被非法利用(如别人可以利用程序自动里从你这里获取数据) 这次 MVP 会议的时候,MS 的自夸,他们就是大量利用 GUID 来保证了网站上不会有链接失效(Link break)。
GUID是很好的主键标识的解决方案,可能有的程序员没有遇见过系统移植,比如以前我做过一个项目,JAVA+SqlServer架构,因一些原因需将之移植到Linux下,得用JAVA+MySQL,而很要命,在SqlServer中用到了自动编号类型的主键,移植中必须将数据导入MySQL,遇上很多的刺手问题,还好数据库的数据还不是很多,用了程序导入,数据库设计总的来说依据3范式,所以必须要程序相应解决了数据的完整性,最后幸不辱使命。 整个移植工作完毕之后,考虑了好多在数据库设计阶段的思路,总结了一些经验。 尽量运用各种常用数据库支持的通用的数据类型,尽量少用或不用自动编号数据库类型; 管理员代号+日期+时间+随机数并不是很好的解决方案,因为同样是损失的索引消耗资源,且程序实现反而不如GUID来得干脆; 不用自动编号字段做主键标识时,尽量少用/不用存储过程根据表中记录的Max(XX)获取当前的最大Int,在你往返查询--&插入数据过程中,时间好象很短,对系统来说已经过了很长时间了,可能你获取了当前应该是100,当你插入数据时,已经又条佬不知什么时候占了100了,这就存在并发的问题; 利用GUID还是解决分布式系统的好方案,在多层分布系统中,多个服务器,多个数据库,如用自动编号,则当你需要汇总数据的时候,会发现麻烦来了,主键重复,系统崩溃。
本文已收录于以下专栏:
相关文章推荐
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的 的一个 16 字节的二进制值。
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值。
以下的文章主要描述的是SQL Server数据表中使用GUID值来作为行标识,GUID(Global unique identifier)全局唯一标识符,GUID(Global unique iden...
  在我们的数据库设计中,数据库的主键是必不可少的,主键的设计对整个数据库的设计影响很大.我就对自动增量字段与Guid字段的性能作一下对比,欢迎大家讨论.
不同的数据库生成GUID的方式不同,当然可以统一用程序来写,比如最后的c++生成guid的方式,但是有时候用数据库自带的方法,可以更简便。
什么是GUID?
GUID: 即Glob...
    在我们设计数据库时,数据库的表主键是必不可少的,主键的设计对整个数据库的设计影响很大。主键的设计主要有使用自动增长字段和使用Guid字段两种,上网搜了一些内容就对自动增量字...
在SQLServer/MySQL数据库中如何取得刚插入的标识值在SQLServer数据库中数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个...
引言【摘自其他文章】:   
     
     最近在对公司以前的一个项目进行调整时发现,数据库中有很多表示“多选状态标识”的字段。“多选状态标识”可能描述的并不十分准确,在这里用我们项目...
插入数据时,自增长列是系统自动处理,不需要你来指定数值,你也指定不了。只有将IDENTITY_INSERT 为 ON 时插入数据时,自增长列你才可以指定一个值
比如我有一个表PZ,有如下列XH,ID,...
标题即问题;用VB.NET敲三层出现的这个问题,是在一些问题之后出现的,之前的问题大都是多打了一个字母,或者丢了一个letter造成的, 看来真是有些太马虎了,改改改!进入正题,下面是数据访问层的代码...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 sql 自动生成guid 的文章

 

随机推荐