mysql实现自增序列

原创 2016年08月30日 15:40:42

在项目中用mysql作数据库。id策略用mysql的自增长。但是有些表优化后进行了分区。导致无法设置主键自增长,因此自实现了一个id生成的序列。

1.建了一张表存储表名和当前序列

2.三种实现方式

1)java同步


    public synchronized int nextInt(String tableKey) {
        SequenceExample example = new SequenceExample();
        example.createCriteria().andTableKeyEqualTo(tableKey);
        int id = 1;
        Sequence sequence = null;
        List<Sequence> list = sequenceMapper.selectByExample(example);
        if(list != null && list.size() > 0) {
            sequence = list.get(0);
            id = sequence.getCuid() + 1;
            sequence.setCuid(id);
            sequenceMapper.updateByExample(sequence, example);
        }else {
            sequence = new Sequence();
            sequence.setCuid(id);
            sequence.setTableKey(tableKey);
            sequenceMapper.insert(sequence);
        }

        return id;
    }

缺点是对所有操作都同步,效率有浪费。如果不是相同的表,那么他们的序列更新不存在竞争关系,不需要同步。

2)mysql行锁

public int nextInt(String tableKey) {
        // 获取mysql的行级锁
        sequenceMapper.getRowLock(tableKey);
        // 操作
        SequenceExample example = new SequenceExample();
        example.createCriteria().andTableKeyEqualTo(tableKey);
        int id = 1;
        Sequence sequence = null;
        List<Sequence> list = sequenceMapper.selectByExample(example);
        if(list != null && list.size() > 0) {
            sequence = list.get(0);
            id = sequence.getCuid() + 1;
            sequence.setCuid(id);
            sequenceMapper.updateByExample(sequence, example);
        }else {
            sequence = new Sequence();
            sequence.setCuid(id);
            sequence.setTableKey(tableKey);
            sequenceMapper.insert(sequence);
        }
        return id;
    }

可行,但是效率还是不够

3)mysql函数

BEGIN
DECLARE id INT DEFAULT 0;
SELECT cuid + 1 INTO id from uc_gen_number where table_key = tableKey for update;
IF id = 0 THEN 
SET id = 1;
INSERT INTO uc_gen_number (table_key, cuid) VALUES (tableKey, id);
ELSE UPDATE uc_gen_number SET cuid = id where table_key = tableKey;
END IF;
RETURN id;
END

可行,效率最好
最终选择了mysql函数的方式。

调mysql函数从1开始生成自增序列值

insert into `tbl_mobile_wap_all_brand_keywords_pc` (id) values(func_sequence_nextval('mysql提供的函数名'))...
  • zelda002
  • zelda002
  • 2015年07月01日 16:26
  • 3555

mysql 自定义自增序列

公司项目需求需要在一张包含自增主键的mysql表中,再次增加一个自增字段,但是mysql只支持一张表一个自增字段。 CREATE TABLE IF NOT EXISTS `sequence` ( ...
  • liuyifeng1920
  • liuyifeng1920
  • 2016年01月14日 15:14
  • 2804

Mysql中自增字段(AUTO_INCREMENT)的一些常识

在系统开发过程中,我们经常要用到唯一编号。使用过mysql的人都应该知道,mysql有一个定义列为自增的属性:AUTO_INCREMENT。 指定了AUTO_INCREMENT的...
  • iamczb
  • iamczb
  • 2015年01月25日 10:52
  • 25879

MYSQL获取自增ID的四种方法

MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是...
  • haiross
  • haiross
  • 2016年01月04日 15:08
  • 20519

MySQL中自定义函数实现id自增长

今天在项目中有这样一个需求,就是需要把table1里面的a,b,c三个字段通过按a,b分组,对c进行汇总,然后插入到table2中的a,b,c中,然后我就这样写的SQL语句: insert into...
  • zylzb
  • zylzb
  • 2014年10月27日 17:30
  • 2487

MySQL UUID函数和自增序列详解

文章来源:http://www.mysqlops.com/2011/03/01/mysql-uuid.html MySQL UUID函数的详解 MySQL中可以有二类用于生成唯一值性质的工...
  • yuzongtao
  • yuzongtao
  • 2015年05月05日 09:39
  • 2314

MySQL自增锁

MySQL自增锁 原文:http://www.cnblogs.com/billyxp/archive/2013/01/22/2871737.html 最近在工作中遇到很多使用MySQL自带的a...
  • qiuyepiaoling
  • qiuyepiaoling
  • 2015年11月19日 10:06
  • 575

mysql创建自增字段

1、创建表格时添加: create table tablename(id int auto_increment primary key,...)  2、创建表格后添加: alter table tab...
  • cc996
  • cc996
  • 2017年04月06日 18:10
  • 3405

mysql自动增长更新

有些用的mysql自动增长时删除一条数据后再将id重新设置,有的上set id = (id -1) 但当id在中间要删除的时候这样要出错 ,我就果断换了另一个方法 #1,删除原有主键: ALTER...
  • u012176588
  • u012176588
  • 2016年11月16日 11:43
  • 1076

mysql AUTO_INCREMENT 设置主键自增

主键自增: CREATE TABLE   test ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(15...
  • wll_1017
  • wll_1017
  • 2015年04月16日 11:12
  • 55761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql实现自增序列
举报原因:
原因补充:

(最多只允许输入30个字)