日期:2014-05-18  浏览次数:20661 次

数据库表的设计问题
最近下了微软的一个演示库
AdventureWorks

里面一些表有rowguid列 如Employee
请问设计这个列的意图是?

------解决方案--------------------
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值。

GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 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();

 cmd.CommandText = "SELECT NewID()";

 string rowID = (string) cmd.ExecuteScalar();

 cmd.CommandText = "INSERT INTO Table(ID,...) VALUES(@ID,...)

 cmd.Parameters.Add("@ID",SqlDbType.UniqueIdentifier).Value = new Guid(rowID);

 cmd.ExecuteNoQuery();

uniqueidentifier 值不能进行算术运算,但可以进行(意义不大的)比较操作和 NULL 检查;它不能象 IDENTITY 列一样,可以获知每行的增加时间的先后顺序,只能通过增加其它时间或时间戳列来完成此功能。


------解决方案--------------------
增加GUID字段确实在很多应用是多余的,只有在那种多客户端收集数据,又没有其他合适的唯一标志的时候使用GUID比较合适。