精华内容
下载资源
问答
  • 2018-03-28 21:24:49

    知道redis有原子性执行lua脚本的能力就好办了,命令介绍在这:http://doc.redisfans.com/script/eval.html


    实现就一句话....是不是有点水....额


    当redis>9时又重新从0开始:

    eval "local cur=redis.call('INCRBY', KEYS[1], 1);if(cur>9) then redis.call('set', KEYS[1], 0); cur=0; end return cur;" 1 mykey

    更多相关内容
  • 背景:MySQL中有各种各样的自增ID。例如我们最常见的表的自增ID,Xid,事务的ID,线程的ID,表的编号ID,binlog日志文件的ID等等。这些ID都是有它自己的增长规律的,并不是随机生成的。MySQL的整体功能设计,有很多...

    背景:MySQL中有各种各样的自增ID。例如我们最常见的表的自增ID,Xid,事务的ID,线程的ID,表的编号ID,binlog日志文件的ID等等。这些ID都是有它自己的增长规律的,并不是随机生成的。MySQL的整体功能设计,有很多地方都依赖于这些ID的增长规律。
    接下来我们选择几个经常遇到的来分析一下。
    自增ID的数据类型
    我们在使用自增ID的时候,定义自增ID字段的类型为int,而int类型是一个大类,它有可以细分为tinyint、smallint、mediumit、int、bigint5中类型。
    每一种int类型的取值范围是不同的,如下表格所示:

    MySQL中的各种自增ID方式及解决方案[图]

    单位换算规则
    上面的表格中,我们提到的占用空间的大小问题,不同的整型数据类型所占用的磁盘存储空间是不同的。具体的换算用到的单位如下:
    1PB(拍字节)=1024TB(太字节),简写为T
    1TB=1024GB(吉字节),简写为G
    1GB=1024MB(兆字节),简写为M
    1MB=1024KB(千字节),简写为K
    1KB=1024Byte(字节),简写为B
    1Byte=8Bit(位),简写为b
    1Bit=1个二进制数字,值为0或者1
    自增ID取值范围
    结合上面的计算转换关系。我们使用tinyint来举例说明它的取值范围是怎么计算来的。
    tinyint占用1个byte,也就是8个bit,1byte=8bit,即为:一个字节等于8位。
    无符号位的计算方式
    一个8位的无符号二进制能存放的二进制数值范围是[00000000~11111111],将其转换为十进制就是[0,255]。
    下面说一下转换的过程是怎么样的。二进制中的数据非0即为1,逢二进一,00000000为最小的二进制数,11111111为最大的二进制数。
    这就是无符号的时候,一个8位的二进制数所能存储数据范围转换为十进制数据存储范围的过程。所以一个8位的二进制数能存储的无符号的十进制数的范围是[0,255]
    有符号位的计算方式
    那有符号的时候,该怎么计算呢?
    在二进制中,正号用0表示,负号用1表示,并且需要把正负号放在二进制的最高位,也就是最左边的位置,剩余右边的7个位置用来表示二进制的具体数值。那么一个有正负号的8位二进制取值范围就是[11111111,01111111]。

    去掉左侧第一位用来标记正负号的位置,还剩余7个位置,这7个位置都是1的时候是最大的二进制数。如果前面使用一个负号(此时用1表示)就是最小的二进制数,围城读后感(https://www.yuananren.com/duhougan/15808.html)如果前面增加一个正号(此时用0表示)就是最大的二进制数。所以一个有正负号的8位的二进制数的取值范围为:[11111111,01111111]。


    怎么有符号的最小值是-127,而不是-128呢?在计算机中,表示负值是用补码。
    为什么有符号的tinyint的最小值是-128?虽然“-0”也是“0”,但根据正、反、补码体系,“-0”的补码和“+0”是不同的,这样就出现两个补码代表一个数值的情况。为了将补码与数字一一对应,所以人为规定“0”一律用“+0”代表。同时为了充分利用资源,就将原来本应该表示“-0”的补码规定为代表-128。
    int和int(11)有什么区别
    这里插一个题外话。因为我看很多同事在创建表的时候,习惯性的对int类型的字段指定一个长度单位。
    例如:int(11)是他们经常使用的方式。
    那么我们在定义表中自增主键或某个int类型的字段的时候,写成int和int(11)有什么区别?
    int(11)中的11表示int类型所能存储的最小值的显示宽度。
    注意,这里是显示宽度,表示可以显示多长的int类型的值。我们从上面表中可以知道,int类型的取值范围为:-2147483648~2147483647,其中的最小值-2147483648
    的长度为11,这里的int(11)表示可以显示出这个最小值的完整内容,而最大值2147483647的长度为10,因为最小值长度为11数值都可以显示出来,那么最大值的长度为10的数值肯定也可以显示出来。
    当我们定义了一个int(11)类型字段后,如果后面不指定UNSIGNEDZEROFILL关键字,这个字段和int是一样的。只有指定的UNSIGNEDZEROFILL之后,这个int(11)中的11才起到作用。他起到的作用就是和UNSIGNEDZEROFILL配合使用,将我们插入的数据,在不满足长度的情况下,在前面补0。
    比如我们定义了int(5)UNSIGNEDZEROFILL,那么当我们插入的数据值1234的时候,它会在1234前面补上0,显示为01234,仅此而已。
    显示宽度只用于显示,并不能限制取值范围和占用空间。
    如:int(3)它也会占用4个字节(byte)的存储空间,并且它允许的最大值也不会是999,而是int整型所允许的取值范围有符号的时候为[-2147483648,2147483647]或者无符号的时候为[0,4294967295]。
    那么int(4)、int(8)、int(11)分别占用几个字节?他们也都是占用4个字节byte,他们的取值范围也都是[-2147483648,2147483647]有符号或者[0,4294967295]无符号,和int不指定长度一样。
    所以我们使用int类型的变量的时候,直接使用tinyint、smallint、mediumit、int、bigint中的某一种就可以,具体使用哪一种根据自己的业务量来定,而不需要为期指定长度。除非你的业务需求中需要在不足数据位数的时候,在前面补0,但是这个功能需要在定义字段的时候结合UNSIGNEDZEROFILL关键字一起使用才有效果。
    表自增主键的自增值
    如果一张表的自增ID用完之后,我们再次向这个表中插入数据会怎么样呢?我们使用tinyint类型的自增主键举例举例来实验一下。
    创建测试的表
    mysql>CREATETABLE`t`(->`id`tinyintunsignedNOTNULLAUTO_INCREMENT,->PRIMARYKEY(`id`)->)ENGINE=InnoDBAUTO_INCREMENT=254DEFAULTCHARSET=utf8mb4;QueryOK,0rowsaffected(0.02sec)
    插入测试数据
    mysql>insertintot(id)values(null);QueryOK,1rowaffected(0.01sec)
    再次插入数据
    mysql>insertintot(id)values(null);ERROR1062(23000):Duplicateentry'255'forkey'PRIMARY'mysql>
    查看表中自增值是多少
    mysql>showcreatetablet\G***************************1.row***************************Table:tCreateTable:CREATETABLE`t`(`id`tinyint(3)unsignedNOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=255DEFAULTCHARSET=utf8mb41rowinset(0.01sec)
    查看表中的数据,结果如下
    mysql>select*fromt;+-----+|id|+---------------+|255|+--------+1rowinset(0.02sec)
    整个过程截图如下,从中我可以可以看出,当自增主键的值,达到最大值之后,我们再次向表中插入数据的时候。自增键的自增值将不会再次增加,一直保持最大值不在变化,我们获取到的自增值也一直是最大值。所以当我们再次插入数据的时候回出现主键冲突的错误。
    如果我们的业务流量比较大,担心自增值会被用完,我们可以把自增键的字段类型设置为8个byte的bigint,这个类型的值,在理论上是不会用完的,但是与此同时,你要付出的存储空间也会别int大一倍。这样就可以避免因为自增主键的自增值被用完后,再次插入数据的时候查询主键冲突错误信息。
    MySQL全局的自增值row_id
    我们在创建表的时候,如果不为表指定任何主键,那么MySQL会给这个表创建一个隐藏的自增ID主键,并且这个隐藏的自增ID的取值是从一个全局变量dict_sys.row_id中获取。这个变量是所有没有主键的表共享的。
    这个变量占用6个byte,它的取值范围是2481,因为这个值对所有没有主键的表共享,如果你的MySQL数据库中,有很多没有主键的表,并且有很多的数据在这些表中,那么这个值是有可能达到最大值的。
    如果这个全局变量的值达到了最大值,它就会从0开始从新开始计算。这就导致了没有主键的表中的数据可能会被覆盖的可能性。试想一下,如果一个表没有主键只有一列varchar类型的字段col_a,我们想里面插入数据的时候。当插入到最大行的时候,它会从0开始计算,此时我们插入an+1的时候,就会回到第一行a1的这个行上,会把a1这个行的数据内容被覆盖为an+1,以此类推,a2会被an+2覆盖掉。
    所以建议所有的表都要设置一个主键,避免这个隐藏的全局自增值到达最大的2481之后会覆盖掉之前插入的数据。有了自增主键,即便是超过了自增值,在插入数据的时候,会有主键冲突的错误,这比不通知我们直接把数据给覆盖掉要好很多。
    Xid
    在MySQL的innodb数据表进行更新操作的时候,会涉及到redolog的两阶段提交和binlog日志的配合。以此来达到数据在逻辑上的一致性,从而保证了在MySQL数据库崩溃异常重启后,innodb表可以恢复已经正常提交的事务,这也就是我们经常所说的innodb的crash-safe的能力。
    Xid是有MySQL的Server层维护的。
    Xid是binlog文件中常见的一个ID,因为binlog是server层维护的日志,所以Xid也是由MySQL的Server层维护的。它在binlog文件中标识一个唯一的事务。
    但是在不同的binlog文件中,这个Xid是有可能相同的。因为这个ID是来自于MySQL执行各种SQL语句的时候的查询编号,MySQL在为所有的SQL语句会分配一个唯一的编号,这个编号来自于全局变量:global_query_id。而global_query_id,它是维护在内存当中。它是占8个字节的bigint类型,最大值为:2的64次方减1。这就意味着,如果MySQL重启了,那么这个变量的值将会丢失,重启后这个值将会重新从0开始累加。
    所以SQL语句的编号将会重新从0开始累加,这个查询语句的编号会赋值给对应的事务编号,但是binlog文件再MySQL重启后,会重新使用新的binlog日志文件。所以在同一个日志文件中,Xid是不可能相同的。
    说Xid在同一个binlog日志文件中不可能相同的说法也不算太严谨,因为如果这个global_query_id达到最大值2的64次方减1之后,从新从0累计也有可能导致同一个binlog文件中的Xid的值重复。但是这个可能性几乎为0,因为我们的binlog日志文件在达到一定的大小后也会重新开启一个新的binlog日志文件。这个是有参数max_binlog_size控制的。
    Innodb的事务ID
    InnoDB的事务ID是指:trx_id。
    和Xid不同,trx_id是由InnoDB引擎自己维护的。它的最大值为2的48次方减1。如果到达它的最大值之后,会从0开始累加。这个值再MySQL重启之后不会清零,它做了持久化的操作,所以重启后的MySQL事务ID是可以累积上一次的值的。
    这可能潜在的隐藏一个bug,如果trx_id到达最大之后,重新从0累加,这就导致了事务的id重复了,这样在MySQL的MVCC多版本数据控制和一致性事务读取的时候,就可能会发生脏读。但是可以忽略这个bug,因为这个值已经很大了,不会那么快就出现这个bug。
    trx_id的值来自于innodb内部自己维护的max_trx_id全局变量。每次需要申请新的trx_id的时候,就获得当前max_trx_id的值,然后再把max_trx_id的值加1为下次准备。注意:只读事务不会占用max_trx_id的值。
    对于正在执行的事务,可以在information_schema.innodb_trx表中看到对应的事务信息,已经当前事务trx_id的值。
    在MySQL的MVCC多版本控制的一致性事务视图在实现的过程中,就依赖于这个trx_id的值,因为它代表了每一行被修改数据的版本号,在每一行数据被修改后,都会拿当前修改这一行数据的事务的trx_id作为当前数据的版本号。当一个事务读到一行数据的时候,判断这个数据是否可见的方法,就是通过事务的一致性视图与这行数据的trx_id做对比。
    线程ID
    线程ID是指:thread_id,我们平时执行showprocesslist;命令的时候就可以显示出这个线程ID。如下所示:
    thread_id的取值来自于系统保存的一个全局变量thread_id_counter,每新建一个连接,就将thread_id_counter赋值给这个新连接的线程变量。
    它的大小是4个字节,最大值为:2的32次方减1,到达最大值之后,他会重新从0累加。但是它也不会重复,因为他们使用了唯一数组的设计理念,如下:
    do{new_id=thread_id_counter++;}while(!thread_ids.insert_unique(new_id).second);
    总结:
    表的自增id达到上限后,再申请时它的值就不会改变,进而导致继续插入数据时报主键冲突的错误。
    row_id达到上限后,则会归0再重新递增,如果出现相同的row_id,后写的数据会覆盖之前的数据。
    Xid只需要不在同一个binlog文件中出现重复值即可。虽然理论上会出现重复值,但是概率极小,可以忽略不计。InnoDB的max_trx_id递增值每次MySQL重启都会被保存起来,所以我们文章中提到的脏读的例子就是一个必现的bug,好在留给我们的时间还很充裕。
    thread_id是我们使用中最常见的,而且也是处理得最好的一个自增id逻辑了。

    展开全文
  • python for 循环 生成新列表给每个字段添加一个自增id 新手总结还望包涵,之前写个循环想给每个循环加个ID,自增的并且求总和,伤脑筋,想半天 后来自己突然顿悟,一下子弄出来了,不仅可以求for循环次数,还可以给...

    python for 循环 生成新列表给每个字段添加一个自增id

    新手总结还望包涵,之前写个循环想给每个循环加个ID,自增的并且求总和,伤脑筋,想半天
    后来自己突然顿悟,一下子弄出来了,不仅可以求for循环次数,还可以给你想要的字段加上ID

    在这里插入图片描述
    这样就可以在for循环里自己不断的增加

    在这里插入图片描述
    还有一种python的高级用法enumerate建议使用这种方法
    在这里插入图片描述

    test_list = [{'name': 'tim', 'age': 10}, {'name': 'joy', 'age': '20'}, {'name': 'john', 'age': '18'}]
    
    for id, value in enumerate(test_list):
        value['id'] = id
        print(id, value)
    

    这样就可以看到循环总数,和给列表增加自增ID了
    谢谢

    展开全文
  • KETTLE根据自增ID循环抽取模型一、应用场景二、kettle模型1、总体流程2、转换配置2.1涉及表结构2.2获取表中最小值2.3获取表中最大值2.4循环条件检验2.5临时表抽取2.6目标表抽取2.7添加递增 一、应用场景 在工作中,...

    一、应用场景

    在工作中,将源库数据量较大表中的数据抽取到目标库中,由于目标服务器性能配置较低,每次抽取数据量达到一定数量后抽取速度降低至每秒几十条,抽取表中存在自增主键(模型中数据库为oracle,主键ID为自增number为示例),可以采用该模型抽取。

    二、kettle模型

    1、总体流程

    在这里插入图片描述
    根据表中ID每次递增10进行循环抽取,流程中先获取表中ID的最小值和最大值,首次抽取进行先判断最小值是否小于或等于最大值,条件为真进入循环进行数据抽取。

    2、转换配置

    2.1涉及表结构

    源表T_RESOURCE
    在这里插入图片描述
    临时表TEMP_TARGET
    在这里插入图片描述
    目标表T_TARGET
    在这里插入图片描述

    2.2获取表中最小值

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    获取表中ID的最小值,如果为空默认值为0,并讲获取的最小值设置为MIN_ID变量。

    SELECT  NVL(MIN(ID),0) AS MIN_ID  FROM T_RESOURCE
    

    2.3获取表中最大值

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    获取表中ID的最大值,如果为空默认值为0,并讲获取的最大值设置为MAX_ID变量。

    SELECT  NVL(MAX(ID),0) AS MAX_ID  FROM T_RESOURCE
    

    2.4循环条件检验

    在这里插入图片描述
    在这里插入图片描述
    比较最小值与最大值,判断是否进入循环抽取。

    2.5临时表抽取

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    将MIN_ID与MIN_ID+10之间的数据抽取到临时表中。

    2.6目标表抽取

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    将临时表中数据抽取到目标表中。

    2.7添加递增

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    将目标表中将ID递增,MIN_ID+10,并设置为下次抽取的MIN_ID。

    SELECT ${MIN_ID}+10 AS MIN_ID FROM DUAL
    
    展开全文
  • 作者:贲绍华 爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。...一、自增ID是.
  • 为了解决Beego Orm多条数据循环无法获取自增id的问题,自己写了这个小方法
  • 最近学习python的一些语法发现原来写的i++的方法只是其中一种python for 循环 生成新列表给每个字段添加一个自增id还可以让代码更加简单一些 现在发现一个高级模块用法 test_list = [{'name': 'tim', 'age': 10}, {...
  • oracle实现自增id

    2021-05-05 02:02:07
    --oracle实现自增id--创建一张T_StudentInfo表create table T_StudentInfo("id" integer not null primary key,xsName nvarchar2(120) not null,xsAge integer not null,Mobile varchar(12),Email varchar(50),...
  • sql循环 生成自增id

    千次阅读 2019-03-02 09:24:00
    with p_x as ( select [id] ,[name] ,[classid] ,[orderid], ROW_NUMBER() OVER(Partition by classid order by orderid) as rowid FROM table ) select * from p_x with p_x ...
  • 自增ID算法snowflake及时间回拔的解决
  • 看了网上很多生成自增ID的策略,最终给出的都是雪花算法,leaf算法。但是却没有满足咱们对于自定义生成规则的需求。在业务上有一部分ID往往是有规则的,比如某个产品的订单号往往是“产品标志+时间+n位流水”,类似...
  • 1创建表/*第一步:创建表格*/create table t_user(id int primary key, --主键,自增长username varchar(20),password varchar(20),type varchar(20));2创建自增序列信息/*第二步:建立自定义的sequence*/CREATE ...
  • MongoDB自增ID

    千次阅读 2020-07-25 21:49:02
    利用一个额外的表存储各个表的自增id,用表格示例如下,这个表命名为 mongoSequence: tableName(需要自增id的表名) seq table1 1 table2 2 定义一个JavaBean: MongoSequence ,跟此表格对应: ...
  • 45 | 自增id用完怎么办? 表定义自增值 id 表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。 create table t(id int unsigned auto_increment primary key) auto_increment=4294967295; ...
  • 简单的说,就是 MySQL 中,如果引擎为 innodb,并且有自增 ID,那么在批量插入的时候, MySQL 其获取自增 ID 的数量为大于批量插入记录数的最小 2^n 次方。 举个栗子: 批量插入记录数 获取的自增 ID 数量 1 2 2...
  • MySQL 里有很多自增id,每个自增 id 都是定义了初始值,然后不停地往上加步长。虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限。比如,无符号整型 (unsigned int) 是 4 ...
  • mysql中的自增id超出上限的问题

    千次阅读 2021-10-17 22:13:51
    在mysql中有多种自增id,除了我们日常开发中使用的自增主键,还有一些自增id,是mysql内部,为了帮助mysql正常运行而使用的。这些自增id,都是定义了初始值,然后不停的累加步长。对于每一种自增id,在mysql中都会...
  • MySQL 里有很多自增id,每个自增 id 都是定义了初始值,然后不停地往上加步长。虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限。比如,无符号整型 (unsigned int) 是 4 ...
  • //获取当前最大的ID并 +1 $maxId = $this->model->max('contract_id'); $contract_id = $maxId+1; //判断编号位数,不足10位,用0补足 if(strlen($contract_id) < 10){ $tempString = ""; for($i=...
  • 1:oracle可以直接创建自增循环序列,但是mysql没有序列 2:mysql实现序列的方式:创建序列表(最少要有序列名,序列值、自增值),基于表创建function实现序列功能 3:序列可以干啥–(日期+时间+序列)可以当做...
  • 自增id批量插入报错

    2020-12-29 03:58:24
    行数据批量delete时,InnoDB如何处理自增ID,是一个潜在的大坑。整个实验步骤如上图:第一步:建表,设定自增列;第二步:指定id=1插入,锚定第一行是id是1;第三步:不指定id,依赖自增机制,插入3行;画外音:此时...
  • 返回自增Id循环插入关联数据

    千次阅读 2016-08-11 18:15:09
    declare @id int INSERT INTO Fotomall_Product_Category(categoryName, parentId, categoryNote,categoryLevel) values (@categoryName, @parentId,@categoryNote,@categoryLevel); set @id=SCOPE_IDENTITY();if(@i
  • MYSQL——数据库自增ID原理

    千次阅读 2020-04-17 11:48:46
    六、mysql中自增ID总结 每种自增 id 有各自的应用场景,在达到上限后的表现也不同: 表的自增 id 达到上限后,再申请时它的值就不会改变,进而导致继续插入数据时报主键冲突的错误。 row_id 达到上限后,则会归 0 ...
  • 在MySQL中,自动递增类型的id字段作为表的主键,作为其他表的外键,这是数据库设计中的常用用法,下面就让爱站技术频道小编为大家带来Java获取最后插入MySQL记录的自增ID值的3种方法。方法一:String sql = "INSERT ...
  • 简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录 原文:简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录 在很多的时候,我们会在数据库的表中设置一个字段:ID,这个ID是一个IDENTITY,也就是说这是一...
  • for循环 for(初始化; 布尔表达式; 更新) { //代码语句 } 1.最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。 2.然后,检测布尔表达式的值。如果为 true,循环体被执行...
  • 我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的,但是在计算机里,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,726
精华内容 13,890
关键字:

循环自增id

友情链接: math1[1].rar