首页 > 数据库 >SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)

SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)

时间:2023-10-12 11:46:01浏览次数:53  
标签:account GUID jobs -- NEWSEQUENTIALID SQL password 主键

SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)

 

在SQL Server 2005环境下,表的主键应该怎样设计.
目前主要用到的主键方案共三种:

  • 自动增长主键
  • 手动增长主键
  • UNIQUEIDENTIFIER主键

1、先说自动增长主键,它的优点是简单,类型支持bigint.但是它有致命的弱点:

当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

 

2、再说手动增长主键,它的优点是自行定制主键列,主键列的数据类型乃至数据样本都可以控制,能够稳定的获得目标键值,不会重复.但是它维护成本比较搞,首先生成键值需要自行编写存储过程来产生,网络开销大,运行时还要考虑到并发冲突等等.

 

3、最后就是UNIQUEIDENTIFIER主键,它利用GUID作为键值,可以直接调用newid()来获得全局唯一标识,即便合并数据表也不会有重复现象.但是GUID有两个弱点:其一,和int类型比较,GUID长度是前者4倍.其二,用newid()获得的GUID毫无规律,因为该列作为主键,必然有聚集索引,那么在插入新数据时,将是一个非常耗时的操作.这样的话UNIQUEIDENTIFIER作为主键将大大有损效率.

所以SQL Server 2000环境下DBA们往往写一个存储过程来生成与时间有关的GUID,即在GUID前面加上生成时间.这样确保生成出来的主键全局唯一并且按时间递增.不过这又回到了第二种主键方案,不便维护.

 

4、SQL Server 2005已经解决了这个问题,使用的是NEWSEQUENTIALID()

这个函数产生的GUID是递增的,下面看下它的用法

复制代码
--创建实验表
--1创建id列的类型为UNIQUEIDENTIFIER
--2ROWGUIDCOL只是这个列的别名,一个表中只能有一个
--3PRIMARY KEY确定id为主键
--4使用DEFAULT约束来自动为该列添加GUID
create table jobs
(
id UNIQUEIDENTIFIER ROWGUIDCOL PRIMARY KEY  NOT NULL
CONSTRAINT [DF_jobs_id] DEFAULT (NEWSEQUENTIALID()),
account varchar(64) not null,
password varchar(64) not null
)
go
 
select * from jobs
--添加实验数据
insert jobs (account,password) values ('tudou','123')
insert jobs (account,password) values ('ntudou','123')
insert jobs (account,password) values ('atudou','123')
insert jobs (account,password) values ('btudou','123')
insert jobs (account,password) values ('ctudou','123')
 
select * from jobs
复制代码

结果:

 

复制代码
--使用identity的是我们可以通过Select @@IDENTITY取到新添加的id
--使用UNIQUEIDENTIFIER怎么办呢?
--采取手动增长的方法select NEWSEQUENTIALID()先取出id再添加
--不行,语法不支持
--可以通过下面的方法取到新添加数据的id
--在ADO.NET中的用法和Select @@IDENTITY一样
DECLARE @outputTable TABLE(ID uniqueidentifier)
INSERT INTO jobs(account, password)
OUTPUT INSERTED.ID INTO @outputTable
VALUES('dtudou', '123')
 
SELECT ID FROM @outputTable
 
--对比下数据
select * from jobs
复制代码

结果:

 

--ROWGUIDCOL是主键列的别名,可以直接当做列名来使用
--这样可以忽略主键列的名称
insert jobs (account,password) values ('etudou','123')
select ROWGUIDCOL from jobs

结果:

 

原文链接

标签:account,GUID,jobs,--,NEWSEQUENTIALID,SQL,password,主键
From: https://www.cnblogs.com/ioriwellings/p/12360115.html

相关文章

  • mysql复制数据库,数据库排序规则不一致问题
    mysql复制数据库步骤1.导出数据库sql文件mysqldump数据库名-h数据库地址-P数据库端口(3306可省略)-u账号-p密码--add-drop-table>/路径/sql文件名.sql 2.确认导出和导入数据库编码和排序规则是否一致showglobalvariableslike'%coll%'showglobalvariabl......
  • 2023_10_12_MYSQL_DAY_04_笔记
    2023_10_12_MYSQL_DAY_04_笔记14章课后作业CREATETABLExi(xidINTPRIMARYKEYAUTO_INCREMENT,xnameVARCHAR(10)UNIQUE,xheadVARCHAR(10)NOTNULL,xlocVARCHAR(30)DEFAULT'浑南区');CREATETABLEclass02(cnoINTPRIMARYKEY......
  • 对于ogg19 mysql 中如果mysql中存在json数据类型,进程会abend问题报错信息 OGG-00774
    对于ogg19mysql是不支持json的这个数据类型还是比较常见的,这个数据类型是在ogg21才开始支持,对于这种报错可以打补丁进行修复Bug29998662:MySQLExtractAbendsWithoutErrorwithJSONdatatypesinbinlog 参考自:MySQLExtractAbendsWithoutErrorWithJSONDataT......
  • 【MySQL】alter table TableName engine=InnoDB 完成表重建
    通过altertable来实现重建表原文地址:https://zhuanlan.zhihu.com/p/610997918mysql基础架构执行原理原文地址:https://blog.csdn.net/Kong_a/article/details/119775660MDL锁介绍原文地址:https://blog.csdn.net/weixin_43189971/article/details/126436023 1、应用背景在日......
  • The database cluster initialisation failed but was not the same version as ini
    问题:不论装哪个版本的postgresql,都报Theprogram"postgres"wasfoundby".../initdb.exe"butwasnotthesameversionasinitdb.和Thedatabaseclusterinitialisationfailed的错误。过程:1设置目录权限无效2更后版本无效3更改目录的路径无效最后解决:根据网......
  • 小程序sql
    <insertid="insert"parameterType="HashMap"> INSERTINTOtb_userSET<iftest="openId!=null"> open_id=#{openId},</if><iftest="nickname!=null"> nickname=#{nic......
  • 简述MyBatis动态SQL
    简述MyBatis动态SQL前言 MyBatis是一个用于Java持久层的开源框架,它提供了一种简化数据库访问的方式。MyBatis的动态SQL功能允许我们根据不同的条件动态生成SQL语句,以实现更灵活的数据库操作。在MyBatis中,我们经常使用以下标签来编写动态SQL:<if/>作用:用于实现简单的条......
  • Docker 安装mysql8.0
    环境CentOS7、MySQL8、SQLyog12需求在Docker中部署MySQL8步骤1、从docker仓库中拉去mysql8.0dockerpullmysql:8.0如果使用dockerpullmysql默认拉取的是最新版本的mysql上面我拉去的是8.0的版本,最后拉取过来的是8.0.27如果有想要指定的版本,可以直接写指定版本,......
  • MySQL 8.0参数最佳实践
    MySQL8.0.34版本my.cnf最佳实践参考实例[client]port=3307socket=/data/mysql/3307/run/mysql.sockdefault-character-set=utf8mb4[mysql]port......
  • 软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析
    引言在SQL中,JOIN是一种重要的操作,用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型,其中之一是RIGHTJOIN。RIGHTJOIN用于从右表中选择所有记录,并将其与左表中匹配的记录组合在一起。本文将深入探讨SQLRIGHTJOIN的语法、用法以及通过实例解析来说明其作用。RIGH......