uniqueidentifier 和 GUID 产生函数

一,UniqueIdentifier 是一个数据类型,用于存储GUID的值。

uniqueidentifier data type Is a 16-byte GUID.

A column or local variable of uniqueidentifier data type can be initialized to a value in the following ways:

  • By using the NEWID function.
  • By converting from a string constant in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, in which each x is a hexadecimal digit in the range 0-9 or a-f. For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid uniqueidentifier value.

Comparison operators can be used with uniqueidentifier values. However, ordering is not implemented by comparing the bit patterns of the two values. The only operations that can be performed against a uniqueidentifier value are comparisons (=, <>, <, >, <=, >=) and checking for NULL (IS NULL and IS NOT NULL). No other arithmetic operators can be used. All column constraints and properties, except IDENTITY, can be used on the uniqueidentifier data type.

Merge replication and transactional replication with updating subscriptions use uniqueidentifier columns to guarantee that rows are uniquely identified across multiple copies of the table.

Converting uniqueidentifier Data

The uniqueidentifier type is considered a character type for the purposes of conversion from a character expression, and therefore is subject to the truncation rules for converting to a character type. That is, when character expressions are converted to a character data type of a different size, values that are too long for the new data type are truncated.

二,对UniqueIdentifier 变量赋值方式有两种,分别是使用GUID产生函数和字符串赋值

1,使用GUID产生函数赋值

declare @ui uniqueidentifier
set @ui=newid()
select @ui

2,使用字符串赋值,字符串的格式是2-1-1-1-3,即‘xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’

declare @ui uniqueidentifier
set @ui=‘AA786048-44BB-E511-80E3-F8B156CF6E62‘
select @ui

三,UniqueIdentifier data type 用于创建table column

1,NewID()用于Default constraint,为每一个数据行生成一个unique value

CREATE TABLE dbo.myTable_Rand
(
    ColumnA uniqueidentifier DEFAULT NewID(),
    ColumnB int,
    columnC varchar(10)
)
go

NewID()函数产生GUID是unique,缺点是value序列的大小是随机的,不是一个始终增加的值(ever-increasing value),Sql Sever 不保证产生的GUID比之前的GUID 大或小。如果将NewID()函数产生GUID作为clustered index key,那么新的数据行插入的位置是random的,导致Page split ,降低 IO 性能。

最佳的clustered index key 应该是递增的(increase),data type is narrow (narrow),值是unique(unique),不会频繁更新(static),NewID() 产生的GUID满足narrow,unique, static,但是不满足increase,因此不是理想中的clustered index key。

2,有序的GUID

NEWSEQUENTIALID()函数产生的GUID值是始终增加(ever-increasing value)的,Sql Sever 保证产生的GUID比之前的GUID 大。NewSequentialID()函数只能用于Table的Default constraint中。

如果将NewSequentialID() 产生的GUID作为clustered index key,那么Insert会将新的row 将插入到table的末尾,reduce page split,推荐使用NewSequentialID()作为clustered index key。

Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started. After restarting Windows, the GUID can start again from a lower range, but is still globally unique. When a GUID column is used as a row identifier, using NEWSEQUENTIALID can be faster than using the NEWID function. This is because the NEWID function causes random activity and uses fewer cached data pages. Using NEWSEQUENTIALID also helps to completely fill the data and index pages.

NEWSEQUENTIALID() can only be used with DEFAULT constraints on table columns of type uniqueidentifier.

You can use NEWSEQUENTIALID to generate GUIDs to reduce page splits and random IO at the leaf level of indexes.

Each GUID generated by using NEWSEQUENTIALID is unique on that computer.

CREATE TABLE dbo.myTable
(
    ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID(),
    ColumnB int,
    columnC varchar(10)
)
go

insert into dbo.myTable(ColumnB,columnC)
values(1,‘a‘),(2,‘c‘)
go

select *
from dbo.myTable
go

四,UniqueIdentifier 的 ROWGUIDCOL  属性

ROWGUIDCOL 属性标记一个 UniqueIdentifier data type的column,可以使用 $ROWGUID 来引用这个column ,一个table 只能有一个uniqueidentifier column 具有RowGUIDCol属性。

CREATE TABLE dbo.myTable_RowGUIDCol
(
    ColumnA uniqueidentifier ROWGUIDCOL not null
            constraint DF__myTable_RowGUIDCol_ColumnA DEFAULT NewID(),
    ColumnB int,
    columnC varchar(10)
)
go

引用$ROWGUID查看被标记为RowGUIDCol 的column

select $ROWGUID
from dbo.myTable_RowGUIDCol

Indicates that the new column is a row GUID column. Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. Applying the ROWGUIDCOL property enables the column to be referenced using $ROWGUID. The ROWGUIDCOL property can be assigned only to a uniqueidentifier column. User-defined data type columns cannot be designated with ROWGUIDCOL.

The ROWGUIDCOL property does not enforce uniqueness of the values stored in the column. ROWGUIDCOL also does not automatically generate values for new rows inserted into the table. To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements or use these functions as the default for the column.

参考文档:

https://msdn.microsoft.com/en-us/library/ms187942(v=sql.110).aspx

https://msdn.microsoft.com/en-us/library/ms190348(v=sql.110).aspx

https://msdn.microsoft.com/en-us/library/ms189786(v=sql.110).aspx

时间: 2024-10-12 00:39:45

uniqueidentifier 和 GUID 产生函数的相关文章

UniqueIdentifier 数据类型 和 GUID 生成函数

UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格式显示,显示的格式是:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中,x是16进制数字,数值范围是从0-9,A-F.由于每个字节存储2个16进制数据,因此,按照存储字节,UniqueIdentifier的格式简写为:4B-2B-2B-2B-6B.使用GUID的好处是:

GUID介绍

GUID介绍 GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值. 世界上的任何两台计算机都

MS SQL GUID

(转自:http://blog.csdn.net/maonongwu/article/details/6327093) GUID介绍 GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9

转载 GUID介绍

转载 http://www.cnblogs.com/illele/archive/2008/02/25/1080554.html GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值.GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9619

SQL Server中的GUID

GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值. 世界上的任何两台计算机都不会生成重复的

常用SQL语句的整理--SQL server 2008(查询三--子查询)和guid

--分页数据----ROW_NUMBER()叫做开窗函数,可以进行分页操作 select ROW_NUMBER() over(order by id)as num,*from gb_data----给每一列加上一个连续的num值,方便取第几个到第几个数据的时候使用的 select ROW_NUMBER() over(order by id)as num,*from gb_data where num>5and num<10--这行代码是错误的,因为系统识别不出来num是多少,为什么呢? --是

开发反模式(GUID) - 伪键洁癖

一.目标:整理数据 有的人有强迫症,他们会为一系列数据的断档而抓狂. 一方面,Id为3这一行确实发生过一些事情,为什么这个查询不返回Id为3的这一行?这条记录数据丢失了吗?那个Column到底是什么?我要为这条数据的丢失负责吗? 二.反模式:填充角落 大多数人对于断档的第一反应就是想要填补其中的空缺.对此,可能有两种做法: 1.不按照顺序分配编号 你可能想要在插入新行时,通过遍历表,将找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键机制.随着你不断地插入新行,断档就被填补起来了

关于Guid

GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可能的数字.GUID的唯一缺陷在于生成的结果串会比较大. 1. 一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络之间使用这一整数. 2. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0

SQL从入门到基础&ndash;03 SQLServer基础1(主键选择、数据插入、数据更新)

一.SQL语句入门 1. SQL语句是和DBMS"交谈"专用的语句,不同DBMS都认SQL语法. 2. SQL语句中字符串用单引号. 3. SQL语句中,对于SQL关键字大小写不敏感,对于字符串值大小写敏感. 4. 创建表.删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署.数据导入中用的很多,Create Table T_Person(Id int not NULL,Name nvarchar(50),Age int NULL).Drop Table T_Person1