MySQL数据表设计之自动增长的实现!
MySQL数据表设计之自动增长的实现!
在实际开发中,有时需要为数据表中添加的新纪录自动生成主键值。例如在员工数据表中添加员工信息时,如果手动填写员工工号,需要在添加员工前查询工号是否被其他员工占用,由于先查询后添加需要一段时间,有可能会出现并发操作时工号被其他人抢占的问题,此时可以为员工工号字段设置自动增长。设置自动增长后,如果往该字段插入值时,MySQL会自动生成唯一的自动增长值。
通过给字段设置AUTO_INCREMENT即可实现自动增长。
设置自动增长的方式有两种,分别为创建数据表时设置自动增长和修改数据表时添加自动增长。
1.创建数据表时设置自动增长
1
2
3
4
|
CREATE TABLE 表名 ( 字段名 数据类型 约束 AUTO_INCREMENT, ... ); |
2.修改数据表时添加自动增长
1
2
3
4
5
|
# 语法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字段自动增长
1
2
3
4
5
|
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字段是否成功设置主键和自动增长
1
2
3
4
5
6
7
8
|
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开始
1
2
3
4
5
6
7
|
mysql> select * from my_auto; + ----+----------+ | id | username | + ----+----------+ | 1 | a | + ----+----------+ 1 row in set (0.00 sec) |
4.添加数据进行测试,这里在id字段插入NULL值,从结果得知id字段使用自动增长值
1
2
3
4
5
6
7
8
9
10
11
|
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开始自增
1
2
3
4
5
6
7
8
9
10
11
12
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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值,使用自动增长
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
1
2
3
4
5
6
7
8
9
|
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字段设置自动增长
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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语句
如:
1
2
3
4
5
6
7
8
|
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) |
若要改变自动增长的计算方式,可以通过改变这两个变量的值来实现。例如,可以使用
1
|
SET @@auto_increment_increment = 10; |
将auto_increment_increment的值改为10 ,这里仅介绍如何查看自动增长系统变量的值,关于变量的相关内容将会在数据库编程章节中的函数模块中学习。
到此这篇关于MySQL数据表设计之自动增长的实现的文章就介绍到这了。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。
共有 0 条评论