-
数据库主键自增策略
2020-08-16 19:46:54数据库主键自增策略: 1.自增长主键策略 优点:简单,不需要程序做特别处理 缺点:这种方法对以后如果项目移植到其他数据库改动会比较大, 而且如果多表合并,就会出现重复的主键 2.使用时间戳+随机数 优点:时间...数据库主键自增策略:
1.自增长主键策略
优点:简单,不需要程序做特别处理
缺点:这种方法对以后如果项目移植到其他数据库改动会比较大,
而且如果多表合并,就会出现重复的主键
2.使用时间戳+随机数
优点:时间简单,与数据库无关,移植性较好
缺点:长度太长,最少也得20位,不进占空间并且建索引的话性能会比较差
3.每次取主键最大值+1作为新的主键
优点:主键长度可控,移植性较好
缺点:并发写可能会造成主键冲突,对并发也不太好控制
4.单独建一个存放主键的表
优点:实现简单,移植性较好
缺点:需要 考虑并发问题,整个系统主键生成都依赖该表,性能影响可能较大
5.UUID:
优点:它能保证每个节点所生成的标识都不会重复
缺点:生成的结果串会比较长,影响性能 -
数据库主键生成策略 方法集合
2015-10-13 11:20:42主键生成方法主要有以下几种: 1、采用mysql自增长主键策略 优点 :简单,不需要程序特别处理 缺点:这种方法对以后如果项目移植到其它数据库上... 优点:实现简单,与数据库无关,移植性较好 缺点主键生成方法主要有以下几种:
1、采用mysql自增长主键策略
优点 :简单,不需要程序特别处理
缺点:这种方法对以后如果项目移植到其它数据库上改动会比较大,oracle、 db2采用Sequence,mysql、sqlServer又采用自增长,通用性不好
2、使用时间戳+随机数
优点:实现简单,与数据库无关,移植性较好
缺点 :长度太长,最少也得20位,不仅占空间并且建索引的话性能会比较差点吧
3、每次取主键最大值+1做为新的主键
优点:主键长度可控,移植性较好
缺点:并发写可能会造成主键冲突,对并发也不太好控制
4、单独建一个存放主键的表
优点:实现简单,移植性较好
缺点:需要考虑并发问题,整个系统主键生成都依赖该表,性能影响可能较大5、uuid,UUID含义是通用唯一识别码 (Universally Unique Identifier),
UUID由以下几部分的组合:(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。(2)时钟序列。(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。优点:分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复
缺点:唯一缺陷在于生成的结果串会比较长,格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。
Web开发中使用推荐:
1、项目基础功能部分,例如菜单功能管理、用户管理、权限管理、机构组织管理、参数管理等采用【方案3】,这些功能一般数据量不大,基本没有大的性能问题和并发问题,如果移植的话改动也比较小
2、对于某些流水、日志类的表可采用【方案2】时间戳+随机数,时间戳做主键此时会更有意义
3、对于系统中大部分实际的业务功能采用【方案1】mysql的自增长策略,这样可减少开发工作量,并且性能和并发都有保障,如果项目就算移植的话,业务功能这部分肯定会有些变动,做二次开发,所以就暂不考虑移植性了。4、并发量非常大的时候推荐使用【方法5】
方法3和方法4比较相似:
方法3控制并发可以采用锁表的方式。
方法4控制并发无需锁全表,只要锁一行即可。
目前暂不太倾向于给数据或者表加锁表的方式,开发起来麻烦些,不同的数据库,加锁方式也不一样。
资料参考:
http://www.iteye.com/topic/1132179
-
mysql主键自增拼接字符串_Mysql实现字符串主键自增示例教程
2021-02-10 09:14:43/*Mysql数据库练习需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求1 pid 为自增主键2 插入数据的时候值添加姓名和年龄3 性别采用随机数的方式生成测试数据如下:张珊 23李四 22.../*
Mysql数据库练习
需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求
1 pid 为自增主键
2 插入数据的时候值添加姓名和年龄
3 性别采用随机数的方式生成
测试数据如下:
张珊 23
李四 22
王五 33
田七 27
赵六 32
*/
-- 创建测试数据库
create database exer ;
-- 使用数据库
use exer;
-- 创建表
drop table if exists tb_person;
create table tb_person(
pid varchar(10),
name varchar(20),
age integer,
sex varchar(1),
primary key(pid)
);
-- 创建存储过程,如果以前的存在,先删除
drop procedure if exists randSex;
delimiter //
create PROCEDURE randSex(in `name` varchar(20),in age int)
begin
-- 声明字符串变量pKey存放表的pid,sex存放年龄
declare pKey,sex varchar(10);
-- 声明int变量,用于存放生成性别的随机数0 - 1
declare var INT;
-- 查询表tb_person的最大pid,存入pKey中
select max(pid) into pKey from tb_person;
-- 如果pKey是空的,就设置初始值为'P_0001'
if pKey is null then
set pKey = 'P_0001';
else
/*
pKey存在
1 截取pKey中的数字部分,加1后重新拼接成 'P_0001'的形式
2 重新赋值给pKey
*/
set pKey = concat('P_',lpad(SUBSTRING(pKey,INSTR(pKey,'_')+1)+1,4,0));
end if;
-- 设置var为rand()函数*2取整数既 0 或者 1
set var = floor(rand()*2);
/*
如果var = 1 设置sex为男,否则设置为女
*/
if var = 1 then
set sex ='男';
else
set sex = '女';
end if;
-- 拼接添加sql,将参数传递进去
set @sqlcmd = concat('insert into tb_person(pid,name,age,sex) value(\'',pKey,'\',\'',name,'\',',age,',\'',sex,'\')');
-- 传递给 stmt
prepare stmt from @sqlcmd;
-- 执行sql
execute stmt;
DEALLOCATE PREPARE stmt;
-- 查看拼接的sql
select @sqlcmd as `sql`;
end;
//
delimiter;
-- 测试
call randSex('张珊',23);
CALL randSex('李四',22);
CALL randSex('王五',33);
CALL randSex('田七',27);
CALL randSex('赵六',32);
--查看结果
select * from tb_person;
-
Mysql实现字符串主键自增示例教程
2018-08-23 16:24:50Mysql数据库练习 需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求 1 pid 为自增主键 2 插入数据的时候值添加姓名和年龄 3 性别采用随机数的方式生成 测试数据如下: .../*
Mysql数据库练习
需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求
1 pid 为自增主键
2 插入数据的时候值添加姓名和年龄
3 性别采用随机数的方式生成
测试数据如下:
张珊 23
李四 22
王五 33
田七 27
赵六 32
*/-- 创建测试数据库
create database exer ;-- 使用数据库
use exer;-- 创建表
drop table if exists tb_person;
create table tb_person(
pid varchar(10),
name varchar(20),
age integer,
sex varchar(1),
primary key(pid)
);-- 创建存储过程,如果以前的存在,先删除
drop procedure if exists randSex;
delimiter //
create PROCEDURE randSex(in `name` varchar(20),in age int)
begin
-- 声明字符串变量pKey存放表的pid,sex存放年龄
declare pKey,sex varchar(10);
-- 声明int变量,用于存放生成性别的随机数0 - 1
declare var INT;
-- 查询表tb_person的最大pid,存入pKey中
select max(pid) into pKey from tb_person;
-- 如果pKey是空的,就设置初始值为'P_0001'
if pKey is null then
set pKey = 'P_0001';
else
/*
pKey存在
1 截取pKey中的数字部分,加1后重新拼接成 'P_0001'的形式
2 重新赋值给pKey
*/
set pKey = concat('P_',lpad(SUBSTRING(pKey,INSTR(pKey,'_')+1)+1,4,0));
end if;
-- 设置var为rand()函数*2取整数既 0 或者 1
set var = floor(rand()*2);
/*
如果var = 1 设置sex为男,否则设置为女
*/
if var = 1 then
set sex ='男';
else
set sex = '女';
end if;
-- 拼接添加sql,将参数传递进去
set @sqlcmd = concat('insert into tb_person(pid,name,age,sex) value(\'',pKey,'\',\'',name,'\',',age,',\'',sex,'\')');
-- 传递给 stmt
prepare stmt from @sqlcmd;
-- 执行sql
execute stmt;
DEALLOCATE PREPARE stmt;
-- 查看拼接的sql
select @sqlcmd as `sql`;
end;
//
delimiter;-- 测试
call randSex('张珊',23);
CALL randSex('李四',22);
CALL randSex('王五',33);
CALL randSex('田七',27);
CALL randSex('赵六',32);--查看结果
select * from tb_person; -
mysql实现自增字符串_Mysql实现字符串主键自增示例教程-Go语言中文社区
2021-02-04 17:22:26/*Mysql数据库练习需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求1 pid 为自增主键2 插入数据的时候值添加姓名和年龄3 性别采用随机数的方式生成测试数据如下:张珊 23李四 22... -
主键生成策略优劣比较以及应用
2017-03-11 20:02:141、采用mysql自增长主键策略 :简单,不需要程序特别处理 :这种方法对以后如果项目移植到其它数据库上改动会比较... :实现简单,与数据库无关,移植性较好 :长度太长,最少也得20位,不仅占空间并且建索引的话 -
SQL主键、外键、索引
2020-03-31 17:28:00全局唯一GUID类型(GUID算法通过网卡MAC地址、时间戳和随机数生成的字符串) 联合主键:两个或更多的字段都设置为主键。(允许一列有重复) 外键:实现一对多、多对多和一对一的关系。 可以通过数据库来约束,也可以不... -
数据库ID生成
2020-09-27 22:24:37插入日志,主键直接使用UUID,满足业务要求 缺点: 使用了Mac地址,因此会暴露Mac地址和生成时间 变种UUID //IP 调用IP // 时间戳 // userId // operatorId // 随机数 1 ~ 10000 String format = "single-IP-%d-%d-%... -
高效快速不重复随机读取数据库mysql数据方式
2021-03-03 14:28:09很多网站都有一个随便看看功能,常见的实现方式是通过数据库的rand()函数来随机排序实现获取随机的数据,但是...因为我的数据id的主键是UUID,查询数据之前,通过random类计算出两个随机数,每次查询数据库都带上这... -
boot 中 Mybatis plus 自定义String类型的主键id并且自动填充
2020-07-13 22:02:23数据库设置时,需要生成的id时表名字 + 时间+ 随机数的格式,类型是String。 解决分析 这里用的mybatis plus 去实现的,官方有给出方案,但是,没有详细说明,而且只给出了返回Long类型的! 问题解决 首先这里... -
golang实现全局唯一id snowflake算法
2020-03-06 00:29:17在应用程序中,经常需要全局唯一的ID作为数据库主键。在一台节点容易全局唯一,那在多台节点呢? 有两个思路: 1使用散列函数,如sha256,加上时间戳、mac地址、cpu负荷、随机数等组成,id足够长,引入多个不确定... -
分布式id的生成方式
2018-04-23 16:32:48数据库自增主键 例如mysql中 AUTO_INCREMENT 标识的列。 优点: 无需程序操作,数据库自动生成。 缺点: 分库分表之后id很可能重复。 数据备份恢复,id会改变。 时间+随机数 使用精确到... -
java web系统在高并发下如何实现订单号生成唯一?
2018-11-06 15:34:40java web系统在高并发下如何实现订单号生成唯一? 系统订单号规则:XXXX(固定字符)+年...注:数据库mysql,订单号不是订单表的主键 关注者 417 被浏览 81,189 关注问题写回答 邀请回答 1 条评论 ... -
asp在线考试系统(asp+access实现)
2009-04-04 19:34:08Randomize是产生随机种子,在使用rnd()函数之前一定要先用Randomize产生随机种子才能实现其产生0~1之间随机数的功能。 for i=1 to session("singlenumber")直到next是选择singlenumber(代表某科目的单选题数量)个... -
用SQL server和ASP.NET实现计算机等级考试教务管理系统。只是实验。思路都可以
2014-05-14 08:38:42YY为语言代码,XX为考场号,KK为座位号 同一级别、语言应根据报名初始库信息按随机数生成准考证,同一考点最多可有99*30=2970名考生;如已生成准考证号,再重新生成准考证号,应该给予提示。 准考证打印 (4) ... -
简要说说唯一I D生成规则
2019-07-15 15:57:38很简单,使用数据库主键自增就可以实现了。 根本不需要UUID, 天生对UUID 没有什么好感。长,麻烦,看着不舒服 有个问题,如果这个ID 是对外暴露的,但是我们有需要不能让别人可以预测。 那就简单的加一次二次处理。... -
java idgenerator_java-随机ID生成器,映射与同列
2021-02-27 21:16:49我们希望有一些实体向客户隐藏其确切ID-主要原因是,我们不希望客户知道数据库中有多少实体.因此,我正在实现一种分配随机ID(必须唯一)的解决方案.换句话说,不是使用唯一的序列号,而是要使用唯一的非序列随机数解决... -
基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)
2011-03-12 10:44:33本网站以xp为Web平台,JSP+Ajax+Servlet+JavaBean+Hibernate为网站实现技术,建立基于MySQL数据库系统的核心动态网页,实现博客网站前台及博客个人维护管理等功能模块。 1、 系统处理的准确性和及时性:系统处理的... -
经典全面的SQL语句大全
2009-11-23 16:31:09首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于... -
MySQL 5权威指南(第3版)--详细书签版
2013-02-05 15:44:001.1.2 关系数据库系统与面向对象数据库系统 3 1.1.3 数据表、记录、字段、查询、SQL、索引和键 3 1.2 MySQL 4 1.3 MySQL的不足 6 1.4 MySQL的版本编号 7 1.4.1 Alpha、Beta、Gamma、Production(Generally ... -
ASP设计在线考试系统OnlineTest
2010-12-02 11:58:41Randomize是产生随机种子,在使用rnd()函数之前一定要先用Randomize产生随机种子才能实现其产生0~1之间随机数的功能。 for i=1 to session("singlenumber")直到next是选择singlenumber(代表某科目的单选题数量)个... -
C#编程经验技巧宝典
2008-06-01 08:59:33100 <br>0158 如何将二进制数转换为十六进制数 100 <br>0159 如何实现0~9之间随机整数 101 <br>0160 如何实现0~1之间随机数 101 <br>0161 如何返回数字的绝对值 101 <br>5.2 控件数据处理... -
net实用类50个常用方法升级版分页
2011-12-09 11:08:33///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句查询... -
net实用类50超级实用方法赠分页
2011-12-07 11:44:15///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句... -
net实用类50超级实用方法赠分页分页控件强大的分页
2012-12-04 14:06:50///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句查询... -
.net50个常用方法简单华丽的分页控件功能大的分页控件 50个实用方法
2013-03-08 14:55:40///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句... -
PaperTest Q&A笔试综述
2021-02-10 19:00:2911.三角形内产生随机数 111 12.赛与问题 …111 13.过河问题〔 intel)… 113 14.数星星问题.… 114 15.交流问题/ Gossip problem 114 16.交换问题. 15 17.换数… 18.消耗问题…… 117 19.四则算式 ... -
SQL sever 实训
2018-06-28 21:10:03--创建触发器,实现即时更新每种产品的库存数量。 CREATE TRIGGER UPDATE_ProNo_Stocks_TRIGGER ON Product FOR UPDATE AS PRINT'已即时更新每种产品的库存数量' GO --使用IF UPDATE(column)尽可能优化... -
SQL主键、外键
2020-03-31 17:28:00全局唯一GUID类型(GUID算法通过网卡MAC地址、时间戳和随机数生成的字符串) 联合主键:两个或更多的字段都设置为主键。(允许一列有重复) 外键:实现一对多、多对多和一对一的关系。 可以通过数据库来约束,也...