在一些中小型项目开发中,字节L自增我们通常会使用自增 ID 来作为主键的面试生成策略,但随着时间的用样推移,数据库的字节L自增信息也会越来越多,尤其是面试使用自增 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的用样情况,那么如果发生了这种情况,字节L自增MySQL 又会怎样执行呢?面试 PS:当然,在分库分表的用样场景中,我们通常会使用雪花算法来替代自增 ID,字节L自增但中小型项目开发中,面试使用自增 ID 的用样场景还是比较多的。 1.自增ID在 MySQL 中,字节L自增如果字段的面试数据类型为整数类型(如 INT、BIGINT 等),用样则可以通过关键字“AUTO_INCREMENT”来设置让当前的字段实现自增,例如以下 SQL: 复制CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(128) );1.2.3.4. 1.1 优点分析自增 ID 的优点如下: 简单方便,能自动为每行数据分配唯一的标识。对于按顺序插入的数据,服务器托管能很好地反映数据插入的先后顺序。1.2 缺点分析自增 ID 的缺点如下: 在数据进行迁移或分库分表时,可能会出现问题,需要特殊处理。如果数据量非常大,可能会达到自增 ID 的上限。存在安全性问题,比如通过自增 ID 可能会推测出一些业务信息。例如,一个电商订单表使用自增 ID 作为主键,可能会被竞争对手通过订单号大致推测出业务量等信息。2.自增ID用完会怎样?自增 ID 分为以下两种情况: 图片
一种是主键自增 ID 用完后的情况,另一种是 InnoDB 引擎中未设置主键时使用 row_id 用完后的场景,它们的情况是不一样的,所以我们分开来聊。 2.1 主键自增ID用完当主键自增 ID 达到上限后,再新增下一条数据时,它的 ID 不会变(还是最大的值),只是此时再添加数据时,免费源码下载因为主键约束的原因,ID 是不允许重复的,所以就会报错提示主键冲突。 我们可以使用以下 SQL 来测试: 复制CREATE TABLE t ( id INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(128) ) auto_increment=2147483647; insert into t(id,`name`) values(null,javacn.site); select * from t; insert into t(id,`name`) values(null,www.javacn.site);1.2.3.4.5.6.7. 以上 SQL 是创建了一个表 t,并且给 t 表的主键 id 设置自增 ID,之后再将表的自增 ID 初始化为 INT(有符号)的最大值 2147483647,然后再添加两条数据。 以上 SQL 的执行结果如下: 图片
从上面的执行结果可以看出:当主键自增 ID 达到上限后,再新增下一条数据时,它的 ID 不会变(还是最大的值),只是此时再添加数据时,因为主键约束的原因,ID 是不允许重复的,所以就会报错提示主键冲突。 2.2 row_id用完如果表没有设置主键,InnoDB 会自动创建一个全局隐藏的 row_id,亿华云计算其长度为 6 个字节,当 row_id 达到上限后,它的执行流程和主键 ID 不同,它是再次归零,然后重新递增,如果出现相同的 row_id,后面的数据会覆盖之前的数据。 |