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提供的函数名'))...

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

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

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

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

mysql创建自增字段

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

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
  • 46316

mysql 数据库自增id 的总结

1.建表时就创建自增列: create table test (  id int auto_increment primary key,  name varchar(20) not null,  pa...

用mysql 语句实现id自增,添加主键。

1、ALTER TABLE `domain_dns_tucows` ADD PRIMARY KEY(`id`);      如果以前有主键的话: ALTER TABLE `domain_dns_tuc...
  • wind_324
  • wind_324
  • 2011年01月19日 09:35
  • 21564

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
  • 17856

MySQL 序列生成函数

由于效率上的需求,我们需要批量入库。 我们有个业务表,分成了主表tab和详情表tab_detail。以前的做法需要一条一条插入,主键自增序列自动生成,并且每次插入后再利用last_insert_id这...

一种实现mysql里自增序列的方法

最近工作中遇到一个需求,需要设计一个自增字段,当每插入一条记录的时候,该字段加1,但是由于种种原因,该字段无法作为primary key存在,这样就需要该字段实现为一个自增序列。 mysql中的aut...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql实现自增序列
举报原因:
原因补充:

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