主键应该怎样设计?目前主要用到的主键方案共三种

自动增长主键

手动增长主键

UNIQUEIDENTIFIER主键

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

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

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

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

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

4、SQLServer 提供了新的解决方法,使用的是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

浅析主键自增长的优缺点相关推荐

  1. mysql主键自增长_全面的MySQL优化面试解析

    本文概要 文章内图片有损,需要高清可以在公众号内回复"大图" 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理 ...

  2. 自增主键与UUID的优缺点

    https://blog.csdn.net/rocling/article/details/83116950 自增主键与UUID的优缺点 rocling 2018-10-17 20:15:02  80 ...

  3. Mysql,SqlServer,Oracle主键自动增长的设置

    Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...

  4. mysql主键自增长空缺_Mysql 主键自增长auto_increment问题分析

    本节内容: Mysql 主键自增长 在mysql数据库中,主键由auto_increment实现自增长,若自定义函数来表示auto_increment的话可以如下: 复制代码 代码示例: create ...

  5. 更新oracle数据库表如何实现主键自增长

     在数据库中实现主键自动增长有利于我们做数据插入操作,在SQL SERVER上创建表时可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置 ...

  6. Mybatis操作数据库实现主键自增长

    (一)oracle中没有主键自增长,所有可以通过创建序列或使用触发器实现 1.先创建表 CREATETABLE USER1(ID NUMBER(10),NAME VARCHAR2(20),SEX VA ...

  7. 3、 AUTO_INCREMENT:主键自增长

    在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值.每增加一条记录,主键会自动以相同的步长进行增长. 通过给字段添加 AUTO_INCREM ...

  8. oracle主键自动增长

    oracle的主键没有自动怎样功能,小编今天给大家说说怎样设置主键自动增长: 1.创建表: create table tb_user ( id NUMBER(10) not null, createt ...

  9. oracle表设置主键自增长,笔记:oracle表设置主键自增长

     orcale设置主键自动增长 随笔记得笔记 以后用到 直接到这里copy create or replace table TBL_SYS_USER ( user_id NUMBER(19) no ...

最新文章

  1. Nginx 301与302配置
  2. javascript 的dateObj.getTime() 在为C#的获取方式
  3. Python 关于bytes类方法对数字转换的误区, Json的重要性
  4. android 来电模式设置,android在root模式下接听来电的方法
  5. KVM之一:安装准备(基于CentOS6.7)
  6. Redis精进:List的使用和应用场景
  7. 《21天学通Java(第6版)》—— 2.7 总结
  8. LiveQing私有云流媒体-云端录像时间轴视频及列表视图
  9. 标准Modbus通讯协议格式
  10. SI446x系列之路--基本操作
  11. JavaScript — DOM API
  12. 关于连接同一wifi,手机可以上网,电脑无法上网问题
  13. 逻辑英语公式R1+R2
  14. 上传声音 微信小程序_微信小程序录音文件保存,播放
  15. [转载]深入理解Android系统网络架构
  16. 归一化处理的目的和意义
  17. 轮播图功能的全实现(自动播放、小点点、按住停止播放、放手后开始播放...)
  18. Ubuntu 22 安装go-ethereum
  19. [Dest0g3 misc] Pngenius,EasyEncode,知道js吗,StringTraffic,Easyword,Python_jail,codegame
  20. 经济低迷时期,企业如何通过知识管理逆风翻盘?

热门文章

  1. SQL教学思路《图书管理系统》习题二:插入数据
  2. 【译】五个ES6功能,让你编写代码更容易
  3. vue-quill-editor + element-ui upload实现富文本图片上传
  4. 1.2 Kali与Debian的关系
  5. mybatis 1 - 获取自增ID
  6. 直播时代:让IOS普通开发者一天内做出一个RTMP直播客户端,并且带有美艳直播功能。(文章最下面有github源码地址)...
  7. Permissions 0644 for '/root/.ssh/id_rsa'
  8. Bash功能与使用技巧
  9. SharePoint 2007 文件夹或者文件名过长
  10. Linux虚拟机基本操作