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的好处是:在不同的Server上,实现GUID数值的“唯一”,SQL Server保证GUID的值总是唯一的,只在极少数情况下可能会重复。
在SQL Server中,UniqueIdentifier 列的特性:
- 系统不会自动为UniqueIdentifier列赋值,必须显式赋值;
- 使用GUID产生函数 NewID()赋值,产生随机的GUID;
- NewSequentialID() 函数只能用于表列的Default约束中,产生顺序的GUID;
- 使用字符串常量赋值,字符串常量的格式是:'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',x是16进制数字,数值范围是从0-9,A-F;
- UniqueIdentifier 值能够比较大小,能够使用is null 或 is not null 操作符判断是否为NULL;
- 能够被RowGUIDCol属性标记,使用$ROWGUID 引用具有RowGUIDCol属性的UniqueIdentifier列;
一,对UniqueIdentifier 变量赋值
1,使用NewID() 为UniqueIdentifier赋值,函数NewID() 用于产生随机的GUID数值。
declare @ui uniqueidentifier
set @ui=newid()
select @ui
2,使用字符串赋值,字符串的格式是:‘xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’
declare @ui uniqueidentifier
set @ui='AA786048-44BB-E511-80E3-F8B156CF6E62'
select @ui
二,创建UniqueIdentifier column
由于UniqueIdentifier 列不是由系统自动赋值,必须显式赋值,可以为UniqueIdentifier列创建Default约束,并使用GUID产生函数赋值。
例如,在Default约束中使用NewID(),为每行数据生成随机的唯一值
CREATE TABLE dbo.myTable_Rand
(
ColumnA uniqueidentifier DEFAULT NewID(),
ColumnB int,
columnC varchar(10)
)
1,随机的GUID
NewID()函数产生的GUID是唯一的,但是,值的大小是随机的,不是一个始终增加的值(ever-increasing value),SQL Sever 不保证产生的GUID比之前的GUID 大或小。如果将NewID()函数产生GUID作为clustered index key,那么新的数据行插入的位置是随机的,这样将导致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是有序的,后产生的GUID比先产生的GUID数值要大,也就是说,该函数产生的GUID值是始终增加(ever-increasing value)的,SQL Sever 保证产生的GUID比之前的GUID 大。NewSequentialID()函数只能用于表列的Default约束中。如果将NewSequentialID() 产生的GUID作为clustered index key,那么Insert会将新的row 将插入到table的末尾,避免 page split,推荐使用NewSequentialID()作为clustered index key。
NewSequentialID() 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)
) insert into dbo.myTable(ColumnB,columnC)
values(1,'a'),(2,'c')

三,ROWGUIDCOL 属性
ROWGUIDCOL 属性用于标记一个表列是 UniqueIdentifier 列,如果一个表列被标记为RowGUIDCol,那么可以使用 $ROWGUID 来引用该列 ,一个表只能有一列具有RowGUIDCol属性,该属性仅有的作用是:指定 $ROWGUID 引用的UniqueIdentifier列。
CREATE TABLE dbo.myTable_RowGUIDCol
(
ColumnA uniqueidentifier ROWGUIDCOL not null
constraint DF__myTable_RowGUIDCol_ColumnA DEFAULT NewID(),
ColumnB int,
columnC varchar(10)
)
引用$ROWGUID查看被标记为RowGUIDCol 的column
select $ROWGUID
from dbo.myTable_RowGUIDCol

参考文档:
uniqueidentifier (Transact-SQL)
NEWSEQUENTIALID (Transact-SQL)
UniqueIdentifier 数据类型 和 GUID 生成函数的更多相关文章
- uniqueidentifier 数据类型(转)
想要产生这种唯一标识的格式的数据: 6F9619FF-8B86-D011-B42D-00C04FC964FF 应该怎么做呢?答: uniqueidentifier 数据类型可存储 16 字节的二进制 ...
- Uniqueidentifier数据类型
一.Uniqueidentifier数据类型 可存储16字节的二进制值 Uniqueidentifier用来存储一个全局唯一标识符,即GUID.GUID是唯一的二进制数:世界上的任何两台计算机都不会生 ...
- UniqueIdentifier 数据类型
UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格 ...
- sql server中的TimeStamp时间戳与UniqueIdentifier数据类型
TimeStamp SQL Server timestamp 数据类型与时间和日期无关.SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序.实现 timest ...
- GUID生成函数
/** * GUID生成函数 * @return string */function create_guid() { $charid = strtoupper(md5(uniqid(mt_rand() ...
- 为Guid数据类型的属性(property)赋值
先来看看数据库表中的字段设计: 在数据库的数据类型为uniqueidentifier. 而在程序中对应的数据类型为GUID. property有get和set,也就是说能获取值也可以赋值.
- SqlServer中的数据类型UniqueIdentifier
SqlServer中的数据类型UniqueIdentifier究竟是什么东东? 该类型一般用来做为主键使用,可用SQL语法的newid()来生成一个唯一的值.我想请问的是,这个值是一个长整型的数据值呢 ...
- Design6:选择合适的数据类型
数据库使用Table来存储海量的数据,细分Table结构,数据最终存储在Table Column中,因此,在设计Table Schema时,必须慎重选择Table Column的Data Type,数 ...
- 在C#项目中需要用double类型操作MSSQL float类型数据(附C#数据类型和SQL数据类型对照)
C#操作SQL Float类型,数据会多很多小数,原来是C#的float和sql的float类型不一致.以下是数据库中与C#中的数据类型对照. /// <summary> /// 数据库中 ...
随机推荐
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 旺财速啃H5框架之Bootstrap(二)
突然感觉不知道写啥子,脑子里面没水了,可能是因为今晚要出去浪,哈哈~~~提前提醒大家平安夜要回家哦,圣诞节生00000000000这么多蛋....继续 上一篇的已经把bootstrap了解个大概了,接 ...
- 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~
一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...
- Flexible 弹性盒子模型之CSS flex-grow 属性
实例 让第二个元素的宽度为其他元素的三倍: div:nth-of-type(1){flex-grow:1;} div:nth-of-type(2){flex-grow:3;} div:nth-of-t ...
- Oracle-BPM安装详解
H3 BPM安装包括两个部分,基础工作包括安装IIS..net Freamwork基础框架.安装完成之后,主要配置安装包括数据库,H3 BPM 程序.下面详细介绍Oracle与H3 BPM对接安装的整 ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- mysql 行级锁的使用以及死锁的预防
一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...
- NodeJS使用mysql
1.环境准备 手动添加数据库依赖: 在package.json的dependencies中新增, "mysql" : "latest", { "nam ...