MySQL 自增序列

-- 5.7.23
select version();

-- 非主键形式的自增字段
create table test3
(
 id int auto_increment not null,
 str varchar(2),
 key(id)
);

-- 自增默认从1开始
insert into test3(str) values('ab');
insert into test3(str) values('cd');

 

-- truncat后,自增序列重新开始
truncate test3;
insert into test3(str) values('ef');

 

-- 设置自增开始值
alter table test3 AUTO_INCREMENT=100;

insert into test3(str) values('gh');

 

-- 同时 创建自增序列字段,与主键

create table test4
(
 id int auto_increment not null,
 str varchar(2),
 num int,
 key(id),
 PRIMARY KEY(str)
);

 

-- duplicate 同样生效

insert into test4(str, num) values('ab',12) on duplicate key update num = num + values(num);

insert into test4(str, num) values('ab',12) on duplicate key update num = num + values(num);

select * from test4;

-- 查询下一个,自增序列的值

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'test4';

注意:使用duplicate 会使,自增序列,出现跳跃式增长。遇到不要感到意外,哈哈~

 

END

 

 

### MySQL存储引擎中的自序列实现与用法 #### 1. 自序列的基础概念 在MySQL中,`AUTO_INCREMENT` 是一种用于生成唯一标识符的功能。它通常被用来作为主键的一部分,确保每条记录都有唯一的编号[^1]。 当定义一个表时,可以通过设置某一列的属性为 `AUTO_INCREMENT` 来启用该功能。例如: ```sql CREATE TABLE example ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); ``` 上述代码会创建一张名为 `example` 的表,其中 `id` 列具有自动长特性。 #### 2. 自序列的工作机制 MySQL 中的自 ID 并不是逐个分配给新插入的数据行,而是在内部进行了优化处理。具体来说,在同一个 SQL 执行过程中多次请求新的自值时,后续请求的数量将是之前数量的两倍[^4]。这种设计可以减少锁竞争并提高性能。 然而需要注意的是,如果数据库重启或者遇到某些特殊情况(比如删除未提交事务),可能会导致间隙出现或重复值丢失等问题[^2]。 #### 3. 使用存储过程管理更复杂的自逻辑 对于一些特殊需求场景下可能需要更加灵活可控的方式来自动生成唯一ID,则可以通过编写用户定义函数(User Defined Function) 或者存储过程来完成这一目标[^3] 。下面展示了一个简单的例子: ```sql DELIMITER $$ CREATE PROCEDURE get_increment_id( IN idname_in VARCHAR(20), IN small_in BIGINT, OUT id_out BIGINT ) BEGIN DECLARE current_value BIGINT; SELECT IFNULL(MAX(id_column), 0)+1 INTO @current_value FROM sequence_table WHERE seq_name=idname_in FOR UPDATE; INSERT INTO sequence_table (seq_name,id_column) VALUES (idname_in,@current_value); SET id_out=@current_value ; END$$ DELIMITER ; ``` 此脚本允许我们根据不同名称的空间获取独立递数值,并且通过显式的锁定(`FOR UPDATE`)保证了多线程环境下的安全性。 #### 4. 跨分片/分布式系统的解决方案考虑 随着业务规模扩大至多个物理节点甚至云服务提供商之间分布部署的情况下,传统的单一服务器上的auto-increment已经无法满足全局一致性要求。此时可采用UUID或者其他基于时间戳加随机因子组合而成的大整型来做为主键替代方案之一;另外还有Snowflake算法也是常用的选择之一。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值