mysql auto increment特性说明

本文详细介绍了MySQL中auto_increment字段的工作原理,包括自动增长、手动更新的影响、冲突处理及删除记录后的行为。

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

1、设置为auto_increment的列具有自增的属性,起始值默认为1,后续没添加一条记录,auto_increment的列自动递增1;

1)创建一个表Ttb1用来测试用;

mysql> create table Ttb1 (ID int not null auto_increment,name char(20),primary key(ID));
mysql> desc Ttb1;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| ID    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

2)连续插入两条记录,在插入数据时,不指定ID的值;

mysql> insert into Ttb1(name) values('zhangsan'),('lisi');
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from Ttb1;
+----+----------+
| ID | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
+----+----------+
2 rows in set (0.00 sec)
在插入数据时,设置了auto_increment 的ID列,该列不指定值时,该值会自动填充,且每添加一条记录,该值加1 ;


2、手动更新某记录的ID值,该ID后的数据(包括ID)不受影响,即该ID的数据不会随着更新后的ID值自动进行变化。

1)为测试效果明显,再往表格插入两条数据。

mysql> insert into Ttb1(name) values('wangwu'),('heliu');
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from Ttb1;
+----+----------+
| ID | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
|  3 | wangwu   |
|  4 | heliu    |
+----+----------+
4 rows in set (0.00 sec)


2)更改其中一条记录的ID值,将ID设置为10;

mysql> update Ttb1 set ID=10 where name='lisi';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

3)再查看表格数据; 可知在更改其中某个具有auto_increment属性的值后,已有的后续数据不受影响。

mysql> select * from Ttb1;
+----+----------+
| ID | name     |
+----+----------+
|  1 | zhangsan |
|<span style="color:#009900;">  3 | wangwu   |
|  4 | heliu  </span>  |
|<span style="color:#ff0000;"> 10 | lisi  </span>   |
+----+----------+
4 rows in set (0.00 sec)

3、如果再往表中继续插入数据,ID值会在原有递增的ID基础上继续递增,而不会在手动指定的auto_increment列的基础上递增;

1)在上表的基础上插入一条记录
mysql> insert into Ttb1(name) values('liutingz');
Query OK, 1 row affected (0.05 sec)

mysql> select * from Ttb1;
+----+----------+
| ID | name     |
+----+----------+
|  1 | zhangsan |
|  3 | wangwu   |
|  4 | heliu    |
| <span style="color:#ff0000;"> 5 | liutingz |</span>
| 10 | lisi     |
+----+----------+
5 rows in set (0.00 sec)


4、插入的数据与原来的ID有冲突时,会提示报错,报错后继续插入数据,可正常插入数据,ID继续正常递增1。
mysql> insert into Ttb1(name) values('liutingz');        //此时ID=6
Query OK, 1 row affected (0.05 sec)

mysql> insert into Ttb1(name) values('liutingz');       <span style="font-family: Arial, Helvetica, sans-serif;">//此时ID=7</span>


Query OK, 1 row affected (0.04 sec)

mysql> insert into Ttb1(name) values('liutingz');      <span style="font-family: Arial, Helvetica, sans-serif;">//此时ID=8</span>

Query OK, 1 row affected (0.04 sec)

mysql> insert into Ttb1(name) values('liutingz');    <span style="font-family: Arial, Helvetica, sans-serif;">//此时ID=9</span>

Query OK, 1 row affected (0.04 sec)

mysql> insert into Ttb1(name) values('liutingz');   <span style="font-family: Arial, Helvetica, sans-serif;">//此时ID=10,与上面已经存在的ID=10有冲突。</span>

<span style="color:#ff0000;">ERROR 1062 (23000): Duplicate entry '10' for key 'PRIMARY'</span>
mysql> insert into Ttb1(name) values('liutingz');
Query OK, 1 row affected (0.03 sec)

mysql> 
mysql> insert into Ttb1(name) values('liutingz');
Query OK, 1 row affected (0.03 sec)

mysql> select * from Ttb1;
+----+----------+
| ID | name     |
+----+----------+
|  1 | zhangsan |
|  3 | wangwu   |
|  4 | heliu    |
|  5 | liutingz |
|  6 | liutingz |
|  7 | liutingz |
|  8 | liutingz |
|  9 | liutingz |
| 10 | lisi     |
| 11 | liutingz |
| 12 | liutingz |
+----+----------+
11 rows in set (0.00 sec)

5、删除某条记录,再插入一条数据是,具有auto_increment的列会在原来的基础上加1,不会使用删除后的auto_increment空出来的值。

1)为方便测试,再上表再插入一条记录;

mysql> insert into Ttb1(name) values('yangbo');
Query OK, 1 row affected (0.03 sec)

mysql> select * from Ttb1;
+----+----------+
| ID | name     |
+----+----------+
|  1 | zhangsan |
|  3 | wangwu   |
|  4 | heliu    |
|  5 | liutingz |
|  6 | liutingz |
|  7 | liutingz |
|  8 | liutingz |
|  9 | liutingz |
| 10 | lisi     |
| 11 | liutingz |
| 12 | liutingz |
| 13 | yangbo   |
+----+----------+
12 rows in set (0.00 sec)
2)删除最后一条记录,再插入一条记录,发现插入的新的记录不会使用删除掉后空出来的ID值,而是再使用继续递增的ID值。

mysql> delete from Ttb1 where name='yangbo';
Query OK, 1 row affected (0.04 sec)

mysql> insert into Ttb1(name) values('chenglong');
Query OK, 1 row affected (0.04 sec)

mysql> select * from Ttb1;
+----+-----------+
| ID | name      |
+----+-----------+
|  1 | zhangsan  |
|  3 | wangwu    |
|  4 | heliu     |
|  5 | liutingz  |
|  6 | liutingz  |
|  7 | liutingz  |
|  8 | liutingz  |
|  9 | liutingz  |
| 10 | lisi      |
| 11 | liutingz  |
| 12 | liutingz  |
| 14 | chenglong |
+----+-----------+
12 rows in set (0.00 sec)


So,经以上测试得知:

1、设置为auto_increment的列具有自增的属性,在不指定该列的值插入数据时,该列的起始值默认为1,没插入一条记录,该列值默认递增1;

2、update auto_increment列的值,不影响后续添加的数据,后续添加的数据,其auto_increment列的值继续在原来递增的基础上递增,但如果后续插入的值如果与前手动update值有冲突时,则报错,后续继续插入数据,可正常插入数据。

3、删除某列的值,不影响后续添加的数据,后续添加的数据,其auto_increment列的值继续在原来递增的基础上递增;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值