最近遇到一个问题:高并发环境下,如何避免MYSQL一张表里的某些列不要重复。

方式一:使用Mysql自带的列唯一索引(Unique)

可以在声明表的时候就加入这样一个约束(下面是mysql的语法):

CREATE TABLE IF NOT EXISTS`test_orderno2` (

`id`int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`name`varchar(50) NOT NULL COMMENT '名称',

`order_no`bigint unsigned NOT NULL COMMENT '编号',

`createtime`int(10) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',PRIMARY KEY(`id`),UNIQUE KEY`uniq_order_no` (`order_no`),UNIQUE KEY`uniq_name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '测试编号';

CREATE TABLE`test_orderno3` (

`id`int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`order_no`bigint(20) unsigned NOT NULL COMMENT '自定义编号',

`order_simple`char(21) NOT NULL COMMENT '简单编号',

`order_complex`char(30) NOT NULL COMMENT '复杂编号',

`createtime`int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',PRIMARY KEY(`id`),UNIQUE KEY`uniq_order_no` (`order_no`),UNIQUE KEY`uniq_order_simple` (`order_simple`),UNIQUE KEY`uniq_order_complex` (`order_complex`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试编号3';

这里对  test_orderno2 表设置了两个列的唯一索引,在插入数据的同时会检查该表这两列是存在,存在则会抛出sql错误

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2018000001' for key 'uniq_order_no

新增行的PHP代码如下:

$count = $test_orderno2->count();$addData['name'] = implode( '',explode('.',uniqid('',true)) );$addData['order_no'] = sprintf( "2018%06s",++$count);$addData['createtime'] = time();$status = $test_orderno2->add($addData);

$test_orderno3 = M('test_orderno3');$count = $test_orderno3->count();$addData['order_no'] = sprintf( "2018%06s",++$count);//唯一性较高的唯一编号(21位)

$system_no = uniqid();$system_no_date = date( 'YmdHis',hexdec(substr($system_no,0,8)) );$system_no_rand = sprintf( "%07s",hexdec(substr($system_no,8,5)) );$addData['order_simple'] = $system_no_date.$system_no_rand;//唯一性高的唯一编号(30位)

$system_no = implode( '',explode('.',uniqid('',true)) );$system_no_date = date( 'YmdHis',hexdec(substr($system_no,0,8)) );$system_no_rand = sprintf( "%07s",hexdec(substr($system_no,8,5)) );$more_entropy = substr($system_no,13,9);$addData['order_complex'] = $system_no_date.$system_no_rand.$more_entropy;$addData['createtime'] = time();//$this->ajaxReturn($addData);

$status = $test_orderno3->add($addData);$this->ajaxReturn(array('status'=>$status));

这样在高并发的时候只满足一个客户端请求,其他客户端请求全部会抛出sql错误。

如果业务需求在高并发的时候要正常处理多个客户端请求成功,则不建议采用该方式

方式二:使用PHP代码进行唯一编号的分配

string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )

PHP函数 uniqid 生成唯一编号代码如下:

/**

* 获取一个带前缀、基于当前时间微秒数的唯一ID。*/

//最简单的一种

$uniqid = uniqid(); //=> string '5b11088f3c40a' (length=13)

// 添加前缀

$uniqid = uniqid('j_'); //=> string 'j_5b11088f3c40a' (length=15)

// 设置combined linear congruential generator,使得唯一性更强

$uniqid = uniqid('',true); //=> string '5b11094264cd58.46100058' (length=23)

了解到 uniqid 的使用,则可以根据该函数来做唯一列

//一行代码得到唯一列

$uniqid = implode( '',explode('.',uniqid('',true)) ); //=> string '5b1109c17228c598550406' (length=22)

方式三:使用PHP代码进行唯一编号的分配,并分配是数字日期型

直接上代码:

1 //1. 并发量高使用 22 (唯一性高)

2 $system_no = implode( '',explode('.',uniqid('',true)) );3 var_dump( $system_no);4 $system_no_date = date( 'YmdHis',hexdec(substr($system_no,0,8)) );5 $system_no_rand = sprintf( "%07s",hexdec(substr($system_no,8,5)) );6 $more_entropy = substr($system_no,13,9);7 //var_dump( $system_no_date."-".$system_no_rand."-".$more_entropy );

8 var_dump( $system_no_date.$system_no_rand.$more_entropy );

line.2-------------得到方式二中的22位唯一字符串

line.4-------------将22中前8位取出,经过研究发现前8既然是当前时间戳16进制,所以根据公式可以得出当前时间戳的YmdHis格式

line.5-------------随后又出去8位到13位,经过研究发现这5位也是16进制,想转化成数字需要锁定FFFFF的值=1048575,最大7位,则使用%07s不足7位则前面补0保持7位

line.6-------------最后还剩下9位数字是为了增加唯一性的,则不用理会

line.8-------------30位的日期型唯一编号便出炉了

1 //2. 通常返回 13 (唯一性较高)

2 $system_no = uniqid();3 var_dump( $system_no);4 $system_no_date = date( 'YmdHis',hexdec(substr($system_no,0,8)) );5 $system_no_rand = sprintf( "%07s",hexdec(substr($system_no,8,5)) );6 //var_dump( $system_no_date."-".$system_no_rand );

7 var_dump( $system_no_date.$system_no_rand );

line.2-------------得到方式二中的13位唯一字符串

line.4-------------将22中前8位取出,经过研究发现前8既然是当前时间戳16进制,所以根据公式可以得出当前时间戳的YmdHis格式

line.5-------------随后又出去8位到13位,经过研究发现这5位也是16进制,想转化成数字需要锁定FFFFF的值=1048575,最大7位,则使用%07s不足7位则前面补0保持7位

line.7-------------21位的日期型唯一编号便出炉了

mysql 唯一编号_Mysql表中唯一编号的分配机制相关推荐

  1. mybatis insert 忽略 联合唯一索引_MySQL实战中,Insert语句的使用心得总结

    提到MySQL的Insert语句,你肯定不陌生,或许已经张口就来:不就是insert into table values(xxx,xxx,xxx)嘛!没错,但在实战中,根据不同的需求场景,插入操作在语 ...

  2. MySQL使用什么关键字添加唯一约束_mysql怎么添加唯一约束?

    方法:1.创建表时,使用"CREATE TABLE 表名(字段名 数据类型 UNIQUE);"语句来添加:2.修改表时,使用"ALTER TABLE 表名 ADD CON ...

  3. oracle行的唯一标识符,数据库表中的唯一标识符字段

    ArcGIS 中使用的所有表和要素类必须包含一个能够唯一标识每行或每个要素的字段. 要在 ArcGIS 中用作唯一标识符,字段必须不为空.包含唯一值,并且属于以下数据类型之一:整型(仅限正值) 字符串 ...

  4. 主键ID是什么,做什么用的?(能够唯一表示数据表中的每个记录,防止数据冲突,冗余)

    能够唯一表示数据表中的每个记录的[字段]或者[字段]的组合就称为主码(主键). 作用 1.主键唯一的识别每一记录; 2.主键将记录和存放在其他表中的数据进行关联.在这一点上,主键是不同表中各记录之间的 ...

  5. MySQL数据库在众多表中对表名的查询及预处理存储过程(变量做表名)

    以下的文章主要介绍的是MySQL数据库在众多表中进行表名与字段名的查询的实际操作步骤,以及对实现其查询所要用到的SQL 语句的介绍,还有两个实际解决方案的描述,以下就是文章的主要内容描述. 在MySQ ...

  6. mysql向表中插中文显示,针对mysql数据库无法在表中插入中文字符的解决方案(彻底解决jav...

    针对mysql数据库无法在表中插入中文字符的解决方案(彻底解决jav 针对mysql数据库无法在表中插入中文字符的解决方案(彻底解决:java.sql.SQLException: Incorrect ...

  7. mysql新加一列_如何使用mysql在建好的表中添加一列

    本文主要向大家介绍了如何使用mysql在建好的表中添加一列,通过具体的代码向大家展示,希望对大家学习mysql有所帮助. mysql如果想在一个已经建好的表中添加一列 有这样的需求,已经建立的表,随着 ...

  8. MySQL删除或清空表中数据的方法

    原标题:MySQL删除或清空表中数据的方法 要想把MySQL中的数据删除或清空,可以通过两种方法来实现:DELETE语句和TRUNCATE TABLE语句. DELETE语句可以将表中所有记录都删除, ...

  9. 把Excel表格通过MySql Workbench导入数据库表中的使用总结

    把Excel表格通过MySql Workbench导入数据库表中的使用总结 今天接到一个任务,把excel表中的数据导入到mysql数据库中,通过半个多小时的鼓捣,基本上摸清了里面的门道. 首先,准备 ...

最新文章

  1. Linux echo输出文本改变颜色
  2. 常用的函数式接口_Function接口_默认方法andThen
  3. Oracle中的wmsys.wm_concat
  4. python六种数据类型不可变_python面试题(-)可变数据类型与不可变数据类型
  5. linux下强行umount卸载设备
  6. 全面超越人类!Google称霸SQuAD,BERT横扫11大NLP测试
  7. LeetCode算法题-Detect Capital(Java实现)
  8. 队列 句子分析 精辟的诠释 有图片
  9. 解决wordpress前后台非常卡的几个方法
  10. matlab数据归一化mapminmax函数
  11. 服务器安装找不到lsi驱动,IBM 服务器 SAS Raid LSI Windows2008 硬盘 驱动
  12. JAVA----流的浅谈之一低级流
  13. 基本粒子群算法小结及算法实例(附Matlab代码)
  14. word2003 字体和标点重叠在一起
  15. 一些高阶矩的介绍,峰度和偏度
  16. 混合整数分布式蚁群优化算法-MIDACO介绍和试用
  17. 使用ZBrush软件的画布功能有什么技巧吗?
  18. 兔子拔萝卜的java游戏_幼儿园中班体育游戏教案详案《小兔拔萝卜》
  19. 联想台式计算机装系统,联想台式电脑用u盘怎么重装win7系统教程
  20. 我的大学(2001-2005,从文艺青年到2B青年)

热门文章

  1. MSVCRTD.lib(crtexe.obj) : error LNK2019
  2. spring里头各种获取ApplicationContext的方法
  3. mysql高效索引之覆盖索引
  4. git clone 一些简单笔记
  5. 利用 Bootstrap 进行快速 Web 开发
  6. 将Sublime Text 3设置为Python全栈开发环境
  7. Precision Helper:最佳免费 CHM 制作软件
  8. 数字图像处理:第十八章 彩色图象处理
  9. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.3. 有心朝Linux作业系统学习者的学习态度)
  10. windows下搭建go开发环境