MySQL 主键自增 Auto Increment用法

MySQL的AUTO_INCREMENT属性用于主键自增。当id为空、为0或NULL时,该字段会自动增长。删除记录并重启MySQL,InnoDB引擎会从已存在的最大id开始,而MyISAM则会继续增长。了解此特性对于数据库管理和面试至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AUTO_INCREMENT简介

MySQL的AUTO_INCREMENT属性可以用于在插入新的记录的时候,进行主键自增。

例如执行下面的SQL:

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;

执行结果如下:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

AUTO_INCREMENT总结

  1. id列设置为AUTO_INCREMENT以后,在inserte语句中,
    如果id列为空,
    或者id列值为0 (SQL Mode不是NO_AUTO_VALUE_ON_ZERO),
    或者id列值NULL (id列为NOT NULL),
    那么id将自动增长。

  2. 通过insert语句在AUTO_INCREMENT列插入更大的值,则序列会被重置为最大值依次增加。

  3. 在使用MySQL时,若表中含自增字段(auto_increment类型),则向表中insert一条记录后,可以调用last_insert_id()来获得最近insert的那行记录的自增字段值。

  4. 一道面试题

问:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

答:如果表的存储引擎是MyISAM,id是18,因为MyISAM会将最大id记录在文件里;如果表的存储引擎是InnoDB,id是15,因为InnoDB会将最大id记录在内存里,重启后会丢失。

Links

### MySQL 中 `AUTO_INCREMENT` 主键的使用方法及其常见问题 #### 自列的工作原理 在 MySQL 数据库中,`AUTO_INCREMENT` 是用于自动加数值的一个属性。当新记录插入到表中时,如果没有显式指定该字段的值,则会自动生成一个新的唯一值[^1]。 对于 `INSERT ... ON DUPLICATE KEY UPDATE` 的情况,在更新阶段可能会也可能不会使用预先分配给 `AUTO_INCREMENT` 列的值。这主要依赖于具体的执行逻辑以及是否存在重复的关键字冲突[^2]。 #### 不同场景下的行为表现 无论 `innodb_autoinc_lock_mode` 参数如何配置,如果尝试向同一张表内插入两条具有相同主键值的数据行——例如先通过 `(NULL, 'b')` 插入一条数据并获得了一个特定编号作为其 ID 后再试图插入另一条带有此已存在ID的新纪录如 `(101,'c')` ——都将触发唯一的约束条件违反异常,并返回错误码 23000 表明无法写入因表格中有重复关键字[^3]。 #### 动态元数据缓存的影响 从 MySQL 8.0 开始,默认情况下动态表元数据会被缓存起来以提高性能;不过也可以调整这个特性来确保每次查询都能获取最新的存储引擎状态信息,但这可能会影响查询效率[^4]。 ```sql CREATE TABLE example ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY(id) ); INSERT INTO example(name) VALUES ('Alice'); -- 假设上面这条语句成功执行后id为1 INSERT INTO example (id,name) VALUES (1,'Bob') ON DUPLICATE KEY UPDATE name='Charlie'; -- 此处由于id=1已经存在,因此name将会被更改为'Charlie' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值