精华内容
下载资源
问答
  • 数据库主键自增策略

    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

    http://baike.baidu.com/link?url=cescZRI1Wb2PjbM0OFcDM6yy0DtlJpX4qDewbad1-1AH8fN3RI-pamxezgq54yY38UbrwNGp-gNVTgpJDUdqO_


    
    展开全文
  • /*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;

    b80f24c241ea736431ed3a4e93519fcd.png

    展开全文
  • Mysql实现字符串主键自增示例教程

    千次阅读 2018-08-23 16:24:50
    Mysql数据库练习  需求:创建一张表,包含四个字段(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数据库练习需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求1 pid 为自增主键2 插入数据的时候值添加姓名和年龄3 性别采用随机数的方式生成测试数据如下:张珊 23李四 22...
  • 主键生成策略优劣比较以及应用

    千次阅读 2017-03-11 20:02:14
    1、采用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-%...
  • 很多网站都有一个随便看看功能,常见的实现方式是通过数据库的rand()函数来随机排序实现获取随机的数据,但是...因为我的数据id的主键是UUID,查询数据之前,通过random类计算出两个随机数,每次查询数据库都带上这...
  • 数据库设置时,需要生成的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系统在高并发下如何实现订单号生成唯一? 系统订单号规则:XXXX(固定字符)+年...注:数据库mysql,订单号不是订单表的主键   关注者 417 被浏览 81,189 关注问题写回答 ​邀请回答 ​1 条评论 ...
  • asp在线考试系统(asp+access实现)

    热门讨论 2009-04-04 19:34:08
    Randomize是产生随机种子,在使用rnd()函数之前一定要先用Randomize产生随机种子才能实现其产生0~1之间随机数的功能。 for i=1 to session("singlenumber")直到next是选择singlenumber(代表某科目的单选题数量)个...
  • YY为语言代码,XX为考场号,KK为座位号 同一级别、语言应根据报名初始库信息按随机数生成准考证,同一考点最多可有99*30=2970名考生;如已生成准考证号,再重新生成准考证号,应该给予提示。 准考证打印 (4) ...
  • 很简单,使用数据库主键自增就可以实现了。 根本不需要UUID, 天生对UUID 没有什么好感。长,麻烦,看着不舒服 有个问题,如果这个ID 是对外暴露的,但是我们有需要不能让别人可以预测。 那就简单的加一次二次处理。...
  • 我们希望有一些实体向客户隐藏其确切ID-主要原因是,我们不希望客户知道数据库中有多少实体.因此,我正在实现一种分配随机ID(必须唯一)的解决方案.换句话说,不是使用唯一的序列号,而是要使用唯一的非序列随机数解决...
  • 本网站以xp为Web平台,JSP+Ajax+Servlet+JavaBean+Hibernate为网站实现技术,建立基于MySQL数据库系统的核心动态网页,实现博客网站前台及博客个人维护管理等功能模块。 1、 系统处理的准确性和及时性:系统处理的...
  • 首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于...
  • 1.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 ...
  • Randomize是产生随机种子,在使用rnd()函数之前一定要先用Randomize产生随机种子才能实现其产生0~1之间随机数的功能。 for i=1 to session("singlenumber")直到next是选择singlenumber(代表某科目的单选题数量)个...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    100 <br>0158 如何将二进制数转换为十六进制数 100 <br>0159 如何实现0~9之间随机整数 101 <br>0160 如何实现0~1之间随机数 101 <br>0161 如何返回数字的绝对值 101 <br>5.2 控件数据处理...
  • ///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句查询...
  • ///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句...
  • ///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句查询...
  • ///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句...
  • PaperTest Q&A笔试综述

    2021-02-10 19:00:29
    11.三角形内产生随机数 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地址、时间戳和随机数生成的字符串) 联合主键:两个或更多的字段都设置为主键。(允许一列有重复) 外键:实现一对多、多对多和一对一的关系。 可以通过数据库来约束,也...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

数据库随机数主键实现