MySQL数据表设计之自动增长的实现

 更新时间:2025年03月12日 10:41:45   作者:坚持就完事了  
本文主要介绍了MySQL数据表设计之自动增长的实现,包括创建数据表时设置自动增长和修改数据表时添加自动增长,具有一定的参考价值,感兴趣的可以了解一下

在实际开发中,有时需要为数据表中添加的新纪录自动生成主键值。例如在员工数据表中添加员工信息时,如果手动填写员工工号,需要在添加员工前查询工号是否被其他员工占用,由于先查询后添加需要一段时间,有可能会出现并发操作时工号被其他人抢占的问题,此时可以为员工工号字段设置自动增长。设置自动增长后,如果往该字段插入值时,MySQL会自动生成唯一的自动增长值。

通过给字段设置AUTO_INCREMENT即可实现自动增长。

设置自动增长的方式有两种,分别为创建数据表时设置自动增长和修改数据表时添加自动增长。

1.创建数据表时设置自动增长

CREATE TABLE 表名 (
字段名 数据类型 约束 AUTO_INCREMENT,
...
);

2.修改数据表时添加自动增长

# 语法1 MODIFY子句
ALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT;

# 语法2 CHANGE子句
ALTER TABLE 表名 CHANGE 字段名 字段名 数据类型 AUTO_INCREMENT;

3.使用AUTO_INCREMENT时注意事项如下:

  • 一个数据表中只能有一个字段设置AUTO_INCREMENT,设置AUTO_INCREMENT字段的数据类型应该是整数类型,并且该字段必须设置了唯一约束或主键约束
  • 如果为自动增长字段插入NULL、0、DEFAULT,或在插入数据时省略了自动增长字段,则该字段会使用自动增长值;如果插入的是一个具体的值,则不会使用自动增长值。
  • 默认情况下,设置AUTO_INCREMENT的字段的值会从1开始自增。如果插入了一个大于自动增长值得具体值,则下次插入的自动增长的值会自动使用最大值加1;如果插入的值小于自动增长值,则不会对自动增长值产生影响
  • 使用DELETE语句删除数据时,自动增长值不会减少或填补空缺
  • 在为字段删除自动增长并重新添加自动增长后,自动增长的初始值会自动设置为该列现有的最大值加1
  • 在修改自动增长值时,修改的值若小于该列现有的最大值,则修改不会生效

4.示例

1.创建数据表,设置id字段自动增长

mysql> create table my_auto (
    -> id int primary key auto_increment,
    -> username varchar(20)
    -> );
Query OK, 0 rows affected (0.04 sec)

2.使用DESC语句查看表结构,验证id字段是否成功设置主键和自动增长

mysql> desc my_auto;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

3.添加数据进行测试,这里省略id字段,并查询结果,从结果可知省略id字段后id字段会使用自动增长值。从1开始

mysql> select * from my_auto;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
+----+----------+
1 row in set (0.00 sec)

4.添加数据进行测试,这里在id字段插入NULL值,从结果得知id字段使用自动增长值

mysql> insert into my_auto values (null,'b');
Query OK, 1 row affected (0.01 sec)

mysql> select * from my_auto;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
|  2 | b        |
+----+----------+
2 rows in set (0.00 sec)

5.添加数据时,在id字段插入具体值5,从结果可知id字段的值从5开始自增

mysql> insert into my_auto values (5,'c');
Query OK, 1 row affected (0.01 sec)

mysql> select * from my_auto;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
|  2 | b        |
|  5 | c        |
+----+----------+
3 rows in set (0.00 sec)

6.添加数据时,在id字段添加0,使用自动增长,从5开始自增,加一变成6

mysql> insert into my_auto values (0,'d');
Query OK, 1 row affected (0.00 sec)

mysql> select * from my_auto;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
|  2 | b        |
|  5 | c        |
|  6 | d        |
+----+----------+
4 rows in set (0.00 sec)

7.添加数据时,在id字段添加DEFAULT值,使用自动增长

mysql> insert into my_auto values (default,'e');
Query OK, 1 row affected (0.01 sec)

mysql> select * from my_auto;
+----+----------+
| id | username |
+----+----------+
|  1 | a        |
|  2 | b        |
|  5 | c        |
|  6 | d        |
|  7 | e        |
+----+----------+
5 rows in set (0.00 sec)

8.使用SHOW CREATE TABLE语句查看自动增长值,从查询结果可知AUTO_INCREMENT=8表明下次插入的自动增长值为8,若下次插入的指定了大于8的值,此处的8会自动更新为下次插入值加1

mysql> show create table my_auto\G
*************************** 1. row ***************************
       Table: my_auto
Create Table: CREATE TABLE `my_auto` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

9.先修改id的自动增长值为10,然后在删除id字段的自动增长,最后再重新为id字段设置自动增长

mysql> # 删除自动增长
mysql> alter table my_auto modify id int;
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> desc my_auto;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| username | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> show create table my_auto\G
*************************** 1. row ***************************
       Table: my_auto
Create Table: CREATE TABLE `my_auto` (
  `id` int NOT NULL,
  `username` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> # 重新为id字段添加自动增长
mysql> alter table my_auto modify id int auto_increment;
Query OK, 5 rows affected (0.03 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> desc my_auto;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> show create table my_auto\G
*************************** 1. row ***************************
       Table: my_auto
Create Table: CREATE TABLE `my_auto` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

5.扩展

MySQL中提供了两个用于维护自动增长的系统变量,分别是AUTO_INCREMENT_MENT和AUTO_INCREMENT_OFFEST,前者表示自增长自动从哪个数开始,它的取值范围是1~65535;后者表示自增长字段每次递增的量。默认为1,取值范围是1~65535

若要查看这两个变量的值,可以使用SHOW VARIABLES语句

如:

mysql> show variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set, 1 warning (0.00 sec)

若要改变自动增长的计算方式,可以通过改变这两个变量的值来实现。例如,可以使用

SET @@auto_increment_increment = 10;

将auto_increment_increment的值改为10 ,这里仅介绍如何查看自动增长系统变量的值,关于变量的相关内容将会在数据库编程章节中的函数模块中学习

到此这篇关于MySQL数据表设计之自动增长的实现的文章就介绍到这了,更多相关MySQL 自动增长内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL表操作插入数据insert语句学习(小白入门篇)

    MySQL表操作插入数据insert语句学习(小白入门篇)

    这篇文章主要为大家介绍了MySQL表操作插入数据insert语句学习小白入门篇,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 简述MySQL 正则表达式

    简述MySQL 正则表达式

    大家都知道MySQL可以通过 LIKE ...% 来进行模糊匹配,MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。对mysql正则表达式知识感兴趣的朋友一起看看吧
    2016-11-11
  • mysql获取枚举的随机值实践

    mysql获取枚举的随机值实践

    在MySQL中,可以使用EL和FLOOR函数结合实现从ENUM类型中随机选择值值,通过生成随机索引并使用ELLTT函数获取相应位置的值值,此方法适用于少量和大量数据场景
    2026-05-05
  • MySQL数据库基础命令大全(收藏)

    MySQL数据库基础命令大全(收藏)

    今天小编给大家整理一下mysql数据库的基础命令,特此分享到脚本之家平台,供大家参考下
    2016-12-12
  • MySQL中的DDL、DML与DCL的深度探究

    MySQL中的DDL、DML与DCL的深度探究

    本文系统介绍了MySQL数据库中的三大SQL语句类别DDL(数据定义语言)、DML(数据操纵语言)和DCL(数据控制语言),感兴趣的朋友跟随小编一起看看吧
    2025-07-07
  • MySQL慢日志输出问题及快速解决方法

    MySQL慢日志输出问题及快速解决方法

    文章介绍了MySQL慢日志输出问题的原因和解决方法,慢日志记录了执行时间超过设定阈值的SQL语句,但有时即使查询时间小于阈值,未使用索引的查询也会被记录,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • linux下安装mysql及mysql.sock问题

    linux下安装mysql及mysql.sock问题

    最近在linux上装mysql时遇到一些棘手的问题,百思不得其解,下面小编给大家带来了linux下安装mysql及mysql.sock问题,感兴趣的朋友一起看看吧
    2018-03-03
  • MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

    MySQL 筛选条件放 ON后 vs 放 WHERE 后的区

    文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关联,WHERE用于过滤,以及在LEFT JOIN中ON用于保行,在INNER JOIN中用于提效,本文介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • MySQL的使用中实现读写分离的教程

    MySQL的使用中实现读写分离的教程

    这篇文章主要介绍了MySQL的使用中实现读写分离的教程,文中分别介绍了mysql-proxy与mysqlnd_ms的使用,需要的朋友可以参考下
    2015-12-12
  • Mysql虚拟列的使用场景

    Mysql虚拟列的使用场景

    MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧
    2025-01-01

最新评论