一、什么是GUID

GUID是16字节的二进制SQL Server数据类型,在表,数据库和服务器之间全局唯一。 GUID代表全局唯一标识符,可与UNIQUEIDENTIFIER互换使用。

二、GUID的使用

要在SQL Server中创建GUID,将使用NEWID()函数,如下所示:

SELECT NEWID()

多次执行上面SQL行,您每次都会看到一个不同的值。 这是因为NEWID()函数每执行一次都会生成一个唯一值。

要声明类型为GUID的变量,使用的关键字是UNIQUEIDENTIFIER,如以下脚本中所述:

DECLARE @UNI UNIQUEIDENTIFIER
SET @UNI = NEWID()SELECT @UNI

如前所述,GUID值在表,数据库和服务器之间是唯一的。 GUID可以视为全局主键。 本地主键用于唯一标识表中的记录。 另一方面,GUID可用于唯一地标识跨表,数据库和服务器的记录。

三、GUID解决了什么问题

让我们看看如果我们在不同数据库的表中有冗余记录会遇到什么问题,以及GUID如何解决这些问题。

执行以下脚本:

CREATE DATABASE EngDB
GOUSE EngDB
GOCREATE TABLE EnglishStudents
(Id INT PRIMARY KEY IDENTITY,StudentName VARCHAR (50)
)
GOINSERT INTO EnglishStudents VALUES ('谢恩')
INSERT INTO EnglishStudents VALUES ('强尼')

在上面的脚本中,我们创建一个名为“ EngDB”的数据库。

然后,我们在此数据库中创建一个表“ EnglishStudents”。

该表有两列:Id和StudentName。 Id列是主键列,我们使用Identity作为约束将其设置为自动递增。

最后,我们将两个名为“ Shane”和“ Jonny”的学生记录插入“ EnglishStudents”表中。

现在,如果您从“ EnglishStudents”表中选择所有记录,您将看到以下输出:

现在,让我们创建另一个数据库“ MathDB”,在数据库中创建表“ MathStudents”,并将一些记录插入表中。 执行以下脚本。

CREATE DATABASE MathDB
GO
USE MathDB
GO
CREATE TABLE MathStudents
(Id INT PRIMARY KEY IDENTITY,StudentName VARCHAR (50)
)
GOINSERT INTO MathStudents VALUES ('莎莉')
INSERT INTO MathStudents VALUES ('爱德华')

现在,让我们创建另一个数据库“ MathDB”,在数据库中创建表“ MathStudents”,并将一些记录插入表中。 执行以下脚本。

现在,如果您从EngDB的EnglishStudents表和MathDB的MathStudents表中选择所有记录,您将看到两个表中的记录将具有相同的主键列ID值。 执行以下脚本以查看此结果:

SELECT * FROM EngDB.dbo.EnglishStudents
SELECT * FROM MathDB.dbo.MathStudents

您将在SQL Server Management Studio中看到以下输出:

来自两个不同数据库中不同表的学生记录的Id列具有相同的值。 这是SQL Server的默认行为。

现在,我们创建一个新表“ Student”,其中包含MathStudents表和EnglishStudents表中所有记录的并集。 执行以下脚本:

USE EngDB
GO
CREATE TABLE Students
(Id INT PRIMARY KEY,StudentName NVARCHAR (50)
)
GOINSERT INTO Students
SELECT * FROM EngDB.dbo.EnglishStudents
UNION ALL
SELECT * FROM MathDB.dbo.MathStudents

在上面的脚本中,我们在EngDB中创建一个新表“ Students”。 该表包含Id和StudentName列。

如果尝试运行上述脚本,则会看到错误:

此错误是由于MathStudents和EnglishStudents表的Id列(也是新创建的Students表的主键列)具有相同的值。

因此,当我们尝试从MathStudents和EnglishStudents表中插入记录的并集时,会发生“违反PRIMARY KEY约束”错误。 执行以下脚本,以查看我们实际尝试在“学生”表中插入的内容。

SELECT * FROM EngDB.dbo.EnglishStudents
UNION ALL
SELECT * FROM MathDB.dbo.MathStudents

但是,如果我们希望记录在多个数据库中具有唯一值怎么办? 例如,我们希望EnglishStudents表和MathStudents表的Id列具有唯一的值,即使它们属于不同的数据库也是如此。 这是我们需要使用GUID数据类型的时候。

您会看到学生Shane和Sally的ID均为1,而Jonny和Edward的ID均为2。这导致违反了Student表的主键约束。

四、GUID解决方案

现在,让我们看看如何使用GUID解决此问题

让我们在EngDB中创建一个表EngStudents1,但是这次我们将Id列的数据类型从INT更改为UNIQUEIDENTIFIER。 要为该列设置默认值,我们将使用default关键字,并将默认值设置为'NEWID()'函数返回的值。

这将确保每当在EngStudents1表中插入新记录时,默认情况下,NEWID()函数都会为Id列生成唯一值。 插入记录时,我们只需指定“默认”作为第一列的值。 这会将默认唯一值插入Id列。 执行以下脚本来创建EngStudents1表:

USE EngDB
GOCREATE TABLE EnglishStudents1
(Id UNIQUEIDENTIFIER PRIMARY KEY default NEWID(),StudentName VARCHAR (50))
GOINSERT INTO EnglishStudents1 VALUES (default,'强尼')
INSERT INTO EnglishStudents1 VALUES (default,'谢恩')

现在,如果您从EnglishStudents1表中选择所有记录,则结果将如下所示:

注意: “ Id”列的值将不同于上表中显示的值,因为它们是即时生成的。 但是,它们应该是全局唯一的。

以相同的方式,在MathDB数据库中创建另一个表MathStudents1。 执行以下脚本:

USE MathDB
GOCREATE TABLE MathStudents1
(Id UNIQUEIDENTIFIER PRIMARY KEY default NEWID(),StudentName VARCHAR (50))
GOINSERT INTO MathStudents1 VALUES (default,'莎莉')
INSERT INTO MathStudents1 VALUES (default,'爱德华')

再次,如果您尝试从MathDB数据库的MathStudents1表中检索所有记录,您将看到类似于以下结果:

现在,我们在EnglishStudents1和MathStudents1表的Id列中具有全局唯一值。 让我们创建一个名为Student1s的新表,就像以前一样,尝试插入EnglishStudents1和MathStudents1中记录的并集。 这次,我们将看到不会出现“违反PRIMARY KEY约束”错误,因为EnglishStudents1和MathStudents1的Id列中的值在EngDB和MathDB数据库中都是唯一的。

USE EngDB
GOCREATE TABLE Students1
(Id UNIQUEIDENTIFIER PRIMARY KEY,StudentName NVARCHAR (50)
)
GOINSERT INTO Students1
SELECT * FROM EngDB.dbo.EnglishStudents1
UNION ALL
SELECT * FROM MathDB.dbo.MathStudents1

您可以在上面的脚本中看到,Id列的类型为UNIQUEIDENTIFIER。 运行上面的脚本,然后尝试从Students1表中检索所有记录,您应该看到与以下内容类似的结果:

您可以看到,使用GUID,我们可以将两个不同数据库中的记录并集插入到新表中,而不会出现“违反PRIMARY KEY约束”错误。

作者有话说

该文档希望能解决你的问题,不能解决你的问题的话,请问“度娘”,走上编程这条路,“度娘”永远是你的法宝。

有些废话的东西你懂的话,完全可以不看;我其实也不喜欢理论上的知识;看看也是涨涨见识,可以在面试的时候,装那什么。

当然很多的理论知识也是借鉴了各位大神的,或者去官网找的。如有冒犯,还请见谅。

坚持日拱一卒、相信复利效应、不断践行践修,让我们活在成长中

SQL 中GUID的使用相关推荐

  1. 在PL/SQL中使用随机数和GUID

          在PL/SQL中使用随机数和GUID FROM  http://hi.baidu.com/yuxichu/blog/item/cc7b08388a398af2b211c7c6.html 2 ...

  2. Sql中的数据类型及区别

    1,char,nchar,nvarchar,varchar有什么区别?   2,text和ntext有什么区别以及和上面各种字符类有什么区别?  3,关于带big和带small的类型,比如:small ...

  3. SQL 中循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  4. SQL中的case when then else end用法

    2019独角兽企业重金招聘Python工程师标准>>> Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sexWHEN '1' THEN ...

  5. 在SQL中使用CRL函数示例

    在SQL中使用CRL函数 实验目标: 1. 在SQL中创建CRL函数,使之能够向指定的计算机发送消息 实验步骤 2. 在VS中创建类发送消息的类 3. 将以下代码黏贴进去 using System; ...

  6. pl/sql中三种游标循环效率对比

    pl/sql中三种游标循环效率对比 - Oracle数据库栏目 - 红黑联盟 http://www.2cto.com/database/201307/224636.html 转载于:https://b ...

  7. SQL中内连接、外连接、交叉连接

    SQL中内连接.外连接.交叉连接 SQL连接可以分为内连接.外连接.交叉连接. 数据库数据:            book表                                      ...

  8. 简单介绍SQL中ISNULL函数使用方法

    这篇文章介绍了SQL Server.MySQL.Oracle三种数据库中ISNULL函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 SQL Ser ...

  9. SQL 中left join ,inner join,right join的区别

    2019独角兽企业重金招聘Python工程师标准>>> sql中存在有左连接  插入 右连接 sql语句 left join ,inner join,right join 进行 wh ...

最新文章

  1. 跨界创立PayPal、特斯拉、SpaceX……,埃隆·马斯克是这样“掌控”知识的
  2. 快速开发mina(翻译)
  3. 基数排序及其思想 C++代码实现及分析 恋上数据结构笔记
  4. WinForm读取指定的config文件的内容
  5. PMP读书笔记(第10章)
  6. 哈佛成功金句 -25则
  7. STM32之RCC原理
  8. mysql 一行取最大值_mysql 分组取最大值的同时获取包含最大值的行的其他字段
  9. 查找一:C++静态查找
  10. linux sed用法
  11. JavaScript数组实现图片轮播
  12. 【啊哈C语言】【习题答案】【第一章】
  13. 广州蓝景分享—「web前端素材」使用CSS动画效果(下)
  14. matlab 矩阵 黑白,各位好 请问怎么用0 1矩阵画出黑白的矩阵如下图所示
  15. 【MySQL】sql查询分组数据的前几名,mysql分组查询前三名
  16. 14 ABSOLUTE评估肿瘤纯度
  17. 海贼王 动漫 全集目录 分章节 精彩打斗剧集
  18. Android各种屏,刘海屏,打孔屏满屏显示
  19. Leetcode:剑指 Offer 58 - II. 左旋转字符串(C++)
  20. 为什么要上机械制造业ERP系统?对企业有什么帮助?

热门文章

  1. Java语言每日一练—第10天:谁是胖子
  2. java建立英文停用词表_pyhanlp 停用词与用户自定义词典
  3. huaweizip安装包_华为安卓安装包无法解压为什么
  4. 旧手机怎么当文件服务器,用旧手机做云存储服务器
  5. 制作U盘启动盘(无广告)
  6. 工程部署: 低算力平台模型性能的优化
  7. win7修改默认锁屏背景
  8. 新手怎么选择蓝牙耳机不被忽悠?注意这两大误区一定不猜雷
  9. 纯C语言实现动态爱心(详解,初学者也能看懂)
  10. Java线程的死锁和活锁