精华内容
下载资源
问答
  • Mongodb自增id实现方法

    2020-09-10 01:49:25
    主要介绍了Mongodb自增id实现方法,分析了MongoDB数据库自增ID的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 这里是修真院后端小...【自增ID有什么坏处?什么样的场景下不使用自增ID?】 1.背景介绍 在MySQL中,数据表的主键一般采用id字段自增的形式。使用自增ID给我们带来不少便捷,但也有不少坏处。 2.知识...

    这里是修真院后端小课堂,每篇分享文从

    【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

    八个方面深度解析后端知识/技能,本篇分享的是:

    【自增ID有什么坏处?什么样的场景下不使用自增ID?】

     

    1.背景介绍


    1. 在MySQL中,数据表的主键一般采用id字段自增的形式。使用自增ID给我们带来不少便捷,但也有不少坏处。

    2.知识剖析


    1. 2.1什么是自增ID(MySQL数据库)
      自增ID是在设计表时如果将id字段的值设置为自增的形式也就是AUTO_INCREMENT,
      那么当插入一行数据时就无需指定id,数据表会根据前一个id值+1进行填充。
      指定了AUTO_INCREMENT的列必须要建索引,一般把ID作为主键,这样系统会自动为ID建立索引。
      2.2自增ID有什么好处?
      (1) 增加记录时,可以不用指定id字段,不用担心主键重复问题。
      (2)数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;
      (3)数字型,占用空间小,易排序,在程序中传递也方便;

    3.常见问题


    1. 自增ID有什么坏处?
      (1) 不具有连续性,表中auto_increment最大值被删除,将不会被重用。就是说会跳号(如果设定的auto_increment_increment是1,那么下一次插入的id值将会从被删除的最大值算起,也就是被删除的最大值+1)
      (2)历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id会有冲突,但如果各自的id还关联了其他表,这就很不好操作。
      (3) 很难处理分布式存储的数据表,尤其是需要合并表的情况下
      (4) 在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重;

    4.解决方案


    4.1自增ID的替代者UUID自增ID的替代者UUID
    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
    UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。

    4.2 UUID的优点
    (1)能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
    (2)保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
    (3)安全性较高
    4.3 UUID的缺点:
    (1)uuid是无序的,这会严重影响到表的插入性能。
    (2)uuid占的空间大

    5.编码实战

     

    6.扩展思考


    由于本人正在学任务一,平时用到的是mysql的自增ID,所以对于自增ID的不具有连续性也是要有解决办法的。
    方法一:可以用insert 语句直接指定id插入语句
    方法二:设置自增值 ALTER TABLE table_name AUTO_INCREMENT = 1;(数字1可以是由你自定义设置的自增值,table_name就是你要使用的数据表)
    方法三:用truncate table table_name ;语句直接清空表数据并重置自增值(table_name就是你要使用的数据表)

    7.参考文献


    CSDN、百度百科

    8.更多讨论


    (1) UUID在MySQL中是以什么类型存放的呢?
    在MySQL里保存UUID做主键,一般是使用char类型存放的。
    (网上有说在PostgreSQL等一些数据库里,都有专门的UUID类型,在这些数据库里以UUID做主键,效率是没问题的)
    (2)有没有办法解决UUID在MySQL数据库的效率慢的问题?
    可以把UUID作为逻辑主键,物理主键依然使用自增ID。
    (3)可以改变自增ID每次的自增量吗?
    auto_increment_offset表示自增长字段从哪个数开始。
    auto_increment_increment表示自增长字段每次递增的量,其默认值是1。
    通过set命令修改,不需要重启mysql,但是要重新打开命令行界面,一般需要用set global来设置(自定义等号后面的数字就可以了)
    set global auto_increment_increment=2;
    set global auto_increment_offset=2;

    1. 鸣谢:
      感谢修真院的师兄和CSDN博客上相关的作者,此教程是在他们之前技术分享的基础上完善而成。

    2. 结束语:
      今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

     

    PPT链接 视频链接

    展开全文
  • 在mapper.xml inser方法添加 useGeneratedKeys=“true” keyProperty=“id” 在实体类自增id上面添加这个注解@TableId(type = IdType.NONE)

    在mapper.xml inser方法添加 useGeneratedKeys=“true” keyProperty=“id”
    在实体类自增id上面添加这个注解@TableId(type = IdType.NONE)

    在清空MySQL数据库中的表的记录后,重新插入数据时自增id不是从1开始,要想在插入数据时id从1开始,用的truncate语句,该语句的作用是清空表中的数据,包括自增主键id。
    truncate table (表名);

    展开全文
  • mybatis获取自增ID

    2015-07-30 17:42:27
    mybatis获取自增IDmybatis获取自增ID
  • SQL 2008 使用insert into 语句时自增ID插入数据时实现自增ID 建立一张User表 使用insert into 语句插入一行新的数据 结果如下

    SQL 2008 使用insert into 语句时自增ID插入数据时实现自增ID

    建立一张User表
    在这里插入图片描述使用insert into 语句插入一行新的数据
    在这里插入图片描述结果如下
    在这里插入图片描述

    展开全文
  • 本文介绍mysql自增ID的起始值修改与设置方法
  • 主要给大家介绍了关于MySQL自增ID耗尽的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • MongoDB自增ID

    千次阅读 2020-07-25 21:49:02
    利用一个额外的表存储各个表的自增id,用表格示例如下,这个表命名为 mongoSequence: tableName(需要自增id的表名) seq table1 1 table2 2 定义一个JavaBean: MongoSequence ,跟此表格对应: ...

    MongoDB默认保存的id是一个ObjectId字符串,有时候我们业务需要一个自增ID的时候,会显的有些麻烦,这里给出一种解决方案。

    利用一个额外的表存储各个表的自增id,用表格示例如下,这个表命名为 mongoSequence:

    tableName(需要自增id的表名)seq (自增序列)
    "table1"1
    "table2"2

    定义一个JavaBean: MongoSequence ,跟此表格对应:

    import org.springframework.data.mongodb.core.index.Indexed;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @Document(collection="mongoSequence")
    public class MongoSequence {
    	
    	// 表名
    	@Indexed(unique=true)
    	private String tableName;
    	
    	// 自增的序列
    	private long seq;
    
    	public String getTableName() {
    		return tableName;
    	}
    
    	public void setTableName(String tableName) {
    		this.tableName = tableName;
    	}
    
    	public long getSeq() {
    		return seq;
    	}
    
    	public void setSeq(long seq) {
    		this.seq = seq;
    	}
    }

     

    然后写一个工具类 MongoSeqUtil,用来获取所需要的表的id

    import org.springframework.data.mongodb.core.FindAndModifyOptions;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    
    public class MongoSeqUtil {
    	
    	public static long getNextSeq(MongoTemplate mongoTemplate, String tableName) {
    		if (tableName.trim().length() == 0) {
    			throw new RuntimeException("Document注解的表名不能为空");
    		}
    		Query query = new Query(Criteria.where("tableName").is(tableName));
    		Update update = new Update();
    		update.inc("seq", 1); // 自增1,也可以作为参数传进来
    		FindAndModifyOptions options = new FindAndModifyOptions();
    		options.upsert(true); // 设置为不存在,则插入
    		options.returnNew(true); // 设置为返回更新后的数据
    		MongoSequence mongoSequence = mongoTemplate.findAndModify(query, update, options, MongoSequence.class);
    		return mongoSequence.getSeq();
    	}
    }

    传入MongoTemplate 和 需要自增的表名,则返回一个最新的序号,没有并发问题,inc是原子性操作。mongoSequence不需要提前插入数据。
    MongoTemplate 参数也可以启动时候注入,这个看自己代码架构。

     

    优化代码:
    字符串参数tableName开发者可能会传错,则里面可能有很多脏数据,可以传Class的形式获取表格名,这样表格是跟JavaBean绑定的,获取此Class的Document注解,就可以获取tableName,优化后如下:

    import org.springframework.data.mongodb.core.FindAndModifyOptions;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    
    public class MongoSeqUtil {
    	
    	public static long getNextSeq(MongoTemplate mongoTemplate, Class<?> clazz) {
    		Document document = clazz.getAnnotation(Document.class);
    		if (document == null) {
    			throw new RuntimeException("请传入被@Document注解的类");
    		}
    		String tableName = document.collection();
    		if (tableName.trim().length() == 0) {
    			throw new RuntimeException("Document注解的表名不能为空");
    		}
    		Query query = new Query(Criteria.where("tableName").is(tableName));
    		Update update = new Update();
    		update.inc("seq", 1); // 自增1,也可以作为参数传进来
    		FindAndModifyOptions options = new FindAndModifyOptions();
    		options.upsert(true); // 设置为不存在,则插入
    		options.returnNew(true); // 设置为返回更新后的数据
    		MongoSequence mongoSequence = mongoTemplate.findAndModify(query, update, options, MongoSequence.class);
    		return mongoSequence.getSeq();
    	}
    }

     

    调用:

    // 传入表名
    long id = MongoSeqUtil.getNextSeq(mongoTemplate, "myTable");
    
    // 传入Class
    long id = MongoSeqUtil.getNextSeq(mongoTemplate, MyTable.class);

    至此,MongoDB自增ID的方案就完成了。

     

    另外还可以参考这个链接,原理是一致的: https://www.runoob.com/mongodb/mongodb-autoincrement-sequence.html

     

    另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细

    https://tinyutil.com/

    还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处

    本文章禁止转载, 可以链接,本文原始地址: https://blog.csdn.net/americaMan/article/details/107581136

    展开全文
  • mysql获取表中自增id的方法: 1. 使用 select MAX(id) from tablename; 获取的是表中最大的id;顺序执行 insert ---> delete 插入的数据----> select MAX(id) from tablename; 获取到的是 insert 之前的最大id...
  • 使用自增id生成,保证唯一性 2.尽可能短 可使用数字求余对应字母的方式处理,创建较短的编号 算法原理 1.加自定义前缀,用于标识 2.格式使用前缀+字母+数字组成,数字只保留N位,超过的使用数字求余的方式使
  • 主要为大家详细介绍了MySQL分表自增ID问题的解决方法,感兴趣的小伙伴们可以参考一下
  • MySQL自增id溢出

    千次阅读 2020-01-29 18:05:03
    初步判断应该是自增id过多影响连接数,但是有多个问题不太理解(如自增id为什么不连续、int(11)会在多大数据时溢出、为什么溢出后会出现mysql连接数激增),所以写下这篇文章加深理解。 自增id为什么不是连续的 ...
  • 项目中经常会用到自增id,比如uid,下面为大家介绍下利用mysql事务特性实现并发安全的自增ID,感兴趣的朋友可以参考下
  • Mysql 自增id 重置

    2018-11-06 22:29:21
    Mysql 自增id 重置 truncate table 表名 运行一下这个就行了,就可以从头开始了
  • 主要介绍了关于mysql自增id的相关资料,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
  • spark生成自增ID

    千次阅读 2019-05-22 10:41:28
    spark生成自增ID代码 import org.apache.spark.sql.types.{LongType, StructField} val a = splitDF.schema.add(StructField("id_sk",LongType)) val b = splitDF.rdd.zipWithIndex() val c...
  • 主要介绍了php实现Mongodb自定义方式生成自增ID的方法,实例分析了Mongodb自增字段的实现技巧与对应php操作方法,需要的朋友可以参考下
  • 本节主要介绍了在oracle数据库里创建自增ID字段的步骤,需要的朋友可以参考下
  • 全局自增ID设计方案

    2018-11-23 14:02:37
    在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象
  • 主要给大家总结介绍了关于MySQL自增ID的一些小问题,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 主要介绍了MySQL表自增id溢出的故障复盘解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了Java实现Twitter的分布式自增ID算法snowflake,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 如果用 int unsigned (int,4个字节 ), 我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 int unsigned,所以最大可以达到2的32幂次方 – 1 = 4294967295。 这里有个小技巧,可以在创建表的时候,直接...
  • 主要介绍了java获取新insert数据自增id的实现方法,在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,024
精华内容 60,009
关键字:

自增id