bitsCN.com

在涉及数据库存储数据的时候,经常会遇到唯一值问题,有的是主键带来的限制,有的则是业务上的需要。

下面介绍几种唯一值的获取或者生产方法:  先建一个测试用的表tbl_user,有三个字段:Id、Name、Age,其中Id为主键。1: drop table if exists `tbl_user`;2: create table3: `tbl_user` (4: `Id` int(10),5: `Name` varchar(20),6: `Age` int(10),7: PRIMARY KEY (`Id`)8: )DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

插入几条数据1: insert into tbl_user values (1000,"小猫",22);2: insert into tbl_user values (1001,"小狗",22);3: insert into tbl_user values (1002,"小刺猬",22);4:5: select * from tbl_user;查询结果:  1.由应用程序根据一定算法生成唯一值:一般采用”MD5(时间戳+随机数)“或者其他的UUID算法,基本也比较好实现。如果遇到多机器上分布的程序访问统一数据库的表,可以把Ip、网卡号等信息考进来就可以解决了(当然可以不是简单的拼接,你可以根据需要去合适的位数经过一定的算法去获取)。

2.先查询表中最大的值select max(id),再加1后作为新的值。很笨的方法。1: select max(Id) from tbl_user;2: 查询到的最大Id为 10023:4: 之后插入 10035:6: insert into tbl_user values (1003,"小熊",22);7:

此时表中数据为

3.如果是表级别的唯一,即在同一个表中某个字段唯一,可以把该字段设置为“自增(AUTO_INCREMENT)”的。这样你不必费心思去生成这个不能重复的唯一值了。但是一般应用程序是需要这个唯一值的,这个时候你就得在查询一次去获取刚才数据库自增生成的Id。比如在用户登录的时候,你要生成一个登录会话Id或者Token,这些程序一般是需要得到这个值而不是仅仅存在数据库中。生成的值,1.可以一般的select条件查询,根据条件查询刚才插入的数据。2.直接调用select @@IDENTITY 就可以得到上一次插入记录时自动产生的ID(注意是在数据库同一个连接(会话)中),用在插入后立即select @@IDENTITY 。

看例子,先将表中的Id字段设置为自增,再插入一条数据(不要插入Id值,让数据库自增得到值),select @@IDENTITY查询,最后验证看看。1.#将Id改为自增(auto_increment)ALTER TABLE tbl_user CHANGE Id Id int not null auto_increment;#或者 先删除Id字段再添加一个Id字段alter table tbl_user auto_increment=1000;alter table tbl_user drop column Id;alter table tbl_user add Id int not null auto_increment primary key first;2.插入一条记录insert tbl_user set Name='小猴',Age=23;3.查询刚才的自增Id值select @@IDENTITY;值是1004,

验证下:select * from tbl_user;得到的当前表记录为

过刚插入的数据“小猴”id为1004,和select @@IDENTITY;结果一样。

4.使用mysql的 UUID()函数。前面的自增字段(auto_increment)只能生成”表内”的唯一值,且需要搭配使其为”唯一的主键或唯一索引”,它的值是逐步增长的。这里的UUID产生的是字符串类型值,固定长度为:36个字符。UUID生成的是在时间、空间上都独一无二的值,是“随机+规则”组合而成。select uuid();select uuid();执行两次,结果:69ad8b74-6d47-11e3-ba6e-7446a08ee8ec69b03c16-6d47-11e3-ba6e-7446a08ee8ec

可以看到,多次调用UUID()函数得到的值不相同,它由五部分组成,并且有连字符(-)隔开,一共36个字符。其中:

前3组值是时间戳换算过来的,解决“时间上唯一”;

第4组值是暂时性保持时间戳的唯一性,重启mysql才会变动;

第5组是mac值转过来的,有助于解决“空间上的唯一”,同一个机器多实例的一般相同。如果mac值获取不到,则是一个随机值。

这些已经可以保证得到的值在时间和空间上的唯一。当然你也可以去掉连字符: select replace(uuid(),'-','')。

在MySQL 5.1.*及更高版本有一个变种的UUID()函数,UUID_SHORT(),可以生成一个17-64位无符号的整数,注意是生成的一个整数,而前面UUID()生成的是字符串。MySQL启动后第一次执行的值是通过时间戳等初始化这个值,在本次运行中再次调用的时候都加1。这个值一般比较大,可以调用right(UUID_SHORT(),9)取后面的若干位。或者,你还可以写成自定义函数,来按需生成这个值。举个例子:#1.调用uuid_short()函数SELECT UUID_SHORT();SELECT UUID_SHORT();#执行两次得到的值递增的:2328563497408921623285634974089217#2.创建一个自定义函数,按需获取唯一值:CREATE DEFINER=`root`@`%` FUNCTION `GetUuidTest`(SysId int) RETURNS int(10)begin declare tmpID int; set tmpID = 0; #SELECT UUID_SHORT() into tmpID; #直接取值 SELECT concat(SysId,right(UUID_SHORT(),8)) into tmpID;#SysId和UUID_SHORT()后8位数拼接得到 return tmpID;end#3.调用自定义的函数GetUuidTest(int)函数:select GetUuidTest(1);select GetUuidTest(1);select GetUuidTest(2);select GetUuidTest(2);#得到结果:174089233 #1+uuid_short()后8位(74089233)组成174089234 #1+uuid_short()后8位(74089234)组成274089235 #2+uuid_short()后8位(74089235)组成274089236 #3+uuid_short()后8位(74089236)组成#uuid_short()值递增,前面在加一个Id,不同的服务器IdSysId不同。#4.在例子中调用自定义函数GetUuidTest(int) 来插入记录:这时候不需要把Id设置为自增了。insert tbl_user set Id=GetUuidTest(1),Name='小熊猫',Age=22;insert tbl_user set Id=GetUuidTest(2),Name='小鸭子',Age=21;

例子中,select * from tbl_user;得到的所有记录为

欢迎转载,方便的话,请注明出处,谢谢!

作者:子韦一bitsCN.com

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

mysql 获取唯一值_mysql获取全局唯一值_MySQL相关推荐

  1. mysql并发获取唯一数值_高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]...

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

  2. 分布式数据库中全局唯一主键

    [相关文章] <分布式数据库中全局唯一主键生成策略的设计与实现> <activiti5.10解决分布式集群部署的主键问题> <分布式环境下数据库主键方案> < ...

  3. 如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  4. 高并发分布式系统中生成全局唯一订单号

    高并发分布式系统中生成全局唯一订单号 我了解的方案如下-------------------------- 1.  使用数据库自增Id 优势:编码简单,无需考虑记录唯一标识的问题. 缺陷: 1)    ...

  5. 互联网为什么需要全局唯一ID?

    来自:网络 ID 生成器在微博我们一直叫发号器,微博就是用这样的号来存储,而我微博里讨论的时候也都是以发号器为标签.它的主要目的确如平常大家理解的"为一个分布式系统的数据object产生一个 ...

  6. 业务系统需要怎样的全局唯一ID? #Ticktick#(环信首席架构师:一乐)

    ID 生成器在微博我们一直叫发号器,微博就是用这样的号来存储,而我微博里讨论的时候也都是以发号器为标签.它的主要目的确如平常大家理解的"为一个分布式系统的数据object产生一个唯一的标识& ...

  7. gabor 幅值域 matlab,基于全局二值模式的特征提取方法及其应用

    基于全局二值模式的特征提取方法及其应用 来源:原创论文网 添加时间:2014-02-09 摘 要 提出一种全局二值模式( GBP) 的纹理分析方法,解决局部二值模式( LBP) 易受噪声影响的问题. ...

  8. mysql 获取唯一值_mysql 获取全局唯一值

    在涉及数据库存储数据的时候,经常会遇到唯一值问题,有的是主键带来的限制,有的则是业务上的需要. 下面介绍几种唯一值的获取或者生产方法: 先建一个测试用的表tbl_user,有三个字段:Id.Name. ...

  9. php mysql 唯一值_mysql 获取全局唯一值_MySQL

    bitsCN.com 在涉及数据库存储数据的时候,经常会遇到唯一值问题,有的是主键带来的限制,有的则是业务上的需要. 下面介绍几种唯一值的获取或者生产方法: 先建一个测试用的表tbl_user,有三个 ...

最新文章

  1. VS2010下创建WEBSERVICE,第二天 ----你会在C#的类库中添加web service引用吗?
  2. terminal怎么运行c语言文件,在mac电脑的terminal里该如何运行c语言
  3. SAP Hybris Commerce里类似ABAP里的透明表设计
  4. 学习SQL数据更新,这一篇就够了!
  5. 苹果cmsv10精仿迅播影院2tu风格主题模板
  6. wdos相关问题解答
  7. java 象限分析_用四种象限分析你(未来的人生走向)
  8. Go基础-go语言的编码规范
  9. Spring(Data-Rest)
  10. JB的Python之旅-爬虫篇--requestsScrapy
  11. WIN10的永久杜比音效的安装(2021)
  12. endnote X7 超级初学者教程
  13. vue 创建图片坐标点_Vue Echarts 显示地图且根据坐标设置标注点
  14. 一部手机失窃而揭露的窃取个人信息实现资金盗取的黑色产业链
  15. juniper服务器连接显示都是网关,Juniper防火墙,LVS DR mode 与 HTTP keepalive 丢包问题追查...
  16. 《阿里云服务器教程3》:手机移动端如何远程登录阿里云服务器ECS
  17. 【技术思路】极客时间-左耳听风-开篇词1
  18. interpro 数据库
  19. 民营企业如何设置绩效考核指标的标准
  20. HTML5开发 页游/手游动画及游戏系列教程(Game Tutorial):(一)物体动起来吧

热门文章

  1. 2018年北邮计算机考研分数线,2018年北京邮电大学软件学院考研复试分数线
  2. Java不适合做爬虫?试试这个工具!
  3. 模拟CMOS 基础知识2——偏置与跨导
  4. 软件设计师数据结构之线性结构复习小结
  5. mac os 安装rz/sz
  6. 银行取款--Python学习小实例
  7. 【闯堂兔2:疯狂马戏团】下载
  8. 昔日的资本宠儿为何沦落成“欠薪”的主角?
  9. c语言程序构造二叉排序树,C语言实现二叉排序树的相关操作
  10. 网站应加强个性化建设 提升SEO优化效果分析