zoukankan      html  css  js  c++  java
  • uniqueidentifier 数据类型(转)

    想要产生这种唯一标识的格式的数据:

    6F9619FF-8B86-D011-B42D-00C04FC964FF


    应该怎么做呢?

    ================================================================

    答:

    uniqueidentifier 数据类型可存储 16 字节的二进制值,其作用与全局唯一标识符 (GUID) 一样。GUID 是唯一的二进制数;世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络中,分配必须具有唯一性的标识符。

    uniqueidentifier 列的 GUID 值通常通过下列方式之一获取:

            在 Transact-SQL 语句、批处理或脚本中调用 NEWID 函数。

            在应用程序代码中,调用返回 GUID 的应用程序 API 函数或方法。

    Transact-SQL NEWID 函数以及应用程序 API 函数和方法用它们的网卡的标识号加上 CPU 时钟的唯一编号来生成新的 uniqueidentifier 值。每个网卡都有唯一的标识号。NEWID 返回的 uniqueidentifier 值是通过使用服务器上的网卡而生成的。应用程序 API 函数和方法返回的 uniqueidentifier 值是通过使用客户端中的网卡而生成的。

    uniqueidentifier 值通常不定义为常量。您可以按下列方式指定 uniqueidentifier 常量:

    字符串格式:'6F9619FF-8B86-D011-B42D-00C04FC964FF'
    二进制格式:0xff19966f868b11d0b42d00c04fc964ff

    uniqueidentifier 数据类型不会按照 IDENTITY 属性的方式为插入的行自动生成新的 ID。例如,若要获取新的 uniqueidentifier 值,则表必须具有指定 NEWID 函数或 NEWSEQUENTIALID 函数的 DEFAULT 子句,或 INSERT 语句必须使用 NEWID 函数。



    CREATE TABLE MyUniqueTable
    (UniqueColumn UNIQUEIDENTIFIER DEFAULT NEWID(),
    Characters VARCHAR(10) )
    GO
    INSERT INTO MyUniqueTable(Characters) VALUES ('uiok')
    INSERT INTO MyUniqueTable VALUES (NEWID(), 'uiok')
    GO
    注意:

    您可以使用 NEWSEQUENTIALID 生成 GUID 以减少叶级别索引上的页争用。NEWSEQUENTIALID 只能与 uniqueidentifier 类型的表列的 DEFAULT 约束一起使用。

    uniqueidentifier 列中可以多次出现某个 uniqueidentifier 值,除非对该列也指定了 UNIQUE 或 PRIMARY KEY 约束。当多个行引用源表中的同一个主键时,引用其他表中 uniqueidentifier 主键的外键列中可以多次出现各个 uniqueidentifier 值。

    一个表可以有多个 uniqueidentifier 列。每个表中可以指定一个具有 ROWGUIDCOL 属性的 uniqueidentifier 列。ROWGUIDCOL 属性指明此列的 uniqueidentifier 值可唯一地标识表中的行。但是,属性不会执行任何强制实现唯一性的操作。必须使用其他机制强制实现唯一性,例如指定列的 PRIMARY KEY 约束。ROWGUIDCOL 属性主要用于 Microsoft SQL Server 2005 复制。具有更新订阅的合并复制和事务复制使用 uniqueidentifier 列来确保在表的多个副本中唯一地标识行。

    uniqueidentifier 数据类型具有下列缺点:

    值长且难懂。这使用户难以正确键入它们,并且更难记住。

    这些值是随机的,而且它们不支持任何使其对用户更有意义的模式。

    也没有任何方式可以决定生成 uniqueidentifier 值的顺序。它们不适用于那些依赖递增的键值的现有应用程序。

    当 uniqueidentifier 为 16 字节时,其数据类型比其他数据类型(例如 4 字节的整数)大。这意味着使用 uniqueidentifier 键生成索引的速度相对慢于使用 int 键生成索引的速度。

    在不要求全局唯一性或首选使用按序列增加的键时,请考虑使用 IDENTITY 属性。





    uniqueidentifier 与 IDENTITY

    uniqueidentifier 根据 NEWID 产生的值是唯一的,可以作为主键,IDENTITY 表示标识,也是自增的,可以作为主键,那么用哪个好呢。

    一、uniqueidentifier 不适用于 Access 数据库。
    二、uniqueidentifier 长度为 16,如此长的值很难让人记住;IDENTITY 一般用 int 类型即长度为 4,且为数字较好记。
    三、uniqueidentifier 不能像 IDENTITY 一样判断记录插入的先后顺序。
    四、uniqueidentifier索引占用的空间更大,所以其效率比int索引的效率低一些。
    五、uniqueidentifier主要用于在拥有多个节点、多台计算机的网络,必须分配具有唯一性的标识符,因为世界上的任何两台计算机都不会生成重复的GUID值。

    所以有人建议用 uniqueidentifier 代替 IDENTITY 是缺乏根据的,是片面的。



    uniqueidentifier数据类型在系统设计中的应用

    什么是uniqueidentifier

    Uniqqueidentifier
    是全局唯一的标识


    UniqueIdentifier    数据类型的列如何赋值?

           1
    使用 NewID()函数 来实现
           2
    直接将字符串的常量转化成这样的格式 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
          
    举例:6F9619FF-8B86-D011-B42D-00C04FC964FF 为有效的UniqueIdentifier数据
           3
    直接赋于32位的十六位数据
          
    举例 0xffffffff00000000ffffffff00000000

    UniqueIdentifier 数据类型 数据实际是怎么在数据库中保存的?

    UniqueIdentifier
    数据类型存储实际的数据是16个字节的二进制值,
    UniQueIdentifier
    可以转化成实际的字符串型和二进制数据类型


    NewID()函数是如何生成唯一的UniqueIdentifier 值的呢?

    NewID
    ()函数是从他们的网卡上的标识数字和CPU时钟的唯一的数字生成新的UniqueIdentifier数据 ,这个数据和GUID是一样的每台计算机能生成全球唯一的值,这样在多台计算机和多网络之间生成具有唯一性的标识符


       使用 Uniqueidentifier数据类型的主要的优点

         Uniqueidentifier
    数据类型主要的优点是在使用newid函数生成值的时候是可以保证值的全球唯一性,可以唯一的标识单行的记录 ,对于多库(尤其是多机器,多网段的数据库的复制)来将比IDEntity来的更有效
        
    其次在使用Identity的情况下,我们对自动生成的值是不能修改的,而Uniqueidentifier数据类型是可以随时修改的


       使用Uniqueidentifier的数据类型的缺点

         1
    对于生成的Uniqueidentifier 类型的值来讲,是无序;在正常显示相关的数据信息的时候,返回的信息是无序的。
    对于 Identity 为标识的数据显示的时候,默认的情况下是根据添加记录的顺序来显示的。这样,对于uniqueidentifier为主键的信息集 ,还是需要一个默认标识排序的字段。

         2
    对于Uniqueidentifier 字段来将数据的实际的信息为16个字节,相对来将比Identity来讲 大的多,相对来将 存储空间和查询的效率会降低很多的。



       在系统数据库的设计中我们如何对Uniqueidentifier,Identity ,和可标识的记录属性(有实际的含义的信息)作为主键 ,这三种方式 进行取舍

    以属性为主键的系统设计情况
         
    在系统设计的过程中单条信息中包含可以表示唯一性的属性(一般不能太多3个以内)而且这样的属性是必填字段。在记录生存周期内一般是不进行改动的,表一般多于50个这样级别的系统以属性为主键 ,这样的方式还是最佳的

       
    举例: 关于学生的管理信息系统 以学生的学号为主键

    Uniqueidentifier 列为主键的情况
        
    在需要多个数据库之间,多个网段之间需要进行数据库的复制时,我们就需要在每一个唯一的标识来区别每一个单条记录,在没有合适的属性来做主键的情况下可以用Uniqueidentifier列来生成主键

    Identity为主键的情况
        
    不需要数据库的复制,和系统比较小的情况下(50表以内)可以用 Identity列来生成主键 ,适合于快速开发。



    理解uniqueidentifier类型和NEWID()

    uniqueidentifier是全局唯一标识符 (GUID)
    NEWID()返回类型为uniqueidentifier
    SQL SERVER联机帮助中的例子:
        declare @myid uniqueidentifier
        set @myid=newid()
        print 'Value of @myid is '+cast(@myid as varchar(255))
    每次运行以上程序返回不同的uniqueidentifier

    NEWID()另外一个应用是在Select出记录时随即选出N条记录
    比如:Select top 5 * from yourtable order by newid()
    这样就能从yourtable表中每次随机地选出5条记录,这对于随机显示新闻的地方比较有用
  • 相关阅读:
    HDU 5640 King's Cake
    HDU 5615 Jam's math problem
    HDU 5610 Baby Ming and Weight lifting
    WHU1604 Play Apple 简单博弈
    HDU 1551 Cable master 二分
    CodeForces659C Tanya and Toys map
    Codeforces 960E 树dp
    gym 101485E 二分匹配
    Codeforces 961E 树状数组,思维
    Codeforces Round #473 (Div. 2) D 数学,贪心 F 线性基,模板
  • 原文地址:https://www.cnblogs.com/yuanyuan/p/1563438.html
Copyright © 2011-2022 走看看