mysql 序列删除_删除行对MySQL序列有什么影响?

一、MySQL序列概述

为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号、交易流水号等。MySQL数据库同样能够支持这样的需求场景,AUTO_INCREMENT就是为MySQL实现序列的方式,它会自动生成序列编号。但是它的使用是有要求的,比如:每个表只能有一个列具备AUTO_INCREMENT属性,并且为整数型

AUTO_INCREMENT列不能包含NULL值(MySQL会自动设置为NOT NULL)

AUTO_INCREMENT列上必选要有索引,常见为primary key和unique index

备注:由于存储引擎的不同对于序列的定义和使用存在差异,本文以innodb引擎作为讲解,具体差异区别,可参考后期分享:《浅析MySQL存储引擎序列属性》

二、场景演示

设置为AUTO_INCREMENT属性后,每一次插入数据都会向前增加一位数,但是如果删除行后,序列会怎么样呢?

mysql> CREATE TABLE animals (

-> id MEDIUMINT NOT NULL AUTO_INCREMENT,

-> name CHAR(30) NOT NULL,

-> PRIMARY KEY (id)

-> );

Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO animals (name) VALUES

-> ('dog'),('cat'),('penguin'),

-> ('lax'),('whale'),('ostrich');

Query OK, 6 rows affected (0.01 sec)

Records: 6 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM animals;

+----+---------+

| id | name |

+----+---------+

| 1 | dog |

| 2 | cat |

| 3 | penguin |

| 4 | lax |

| 5 | whale |

| 6 | ostrich |

+----+---------+

6 rows in set (0.00 sec)

对于动物编号来说,序列的作用确实很好用,但是当删除某行数据后,序列会发生什么情况呢?

Query OK, 3 rows affected (0.02 sec)

mysql> SELECT * FROM animals;

+----+---------+

| id | name |

+----+---------+

| 1 | dog |

| 3 | penguin |

| 5 | whale |

+----+---------+

3 rows in set (0.00 sec)

现在序列(id)发生了断层

Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM animals;

+----+---------+

| id | name |

+----+---------+

| 1 | dog |

| 3 | penguin |

| 5 | whale |

| 7 | Horse |

+----+---------+

4 rows in set (0.00 sec)

mysql> INSERT INTO animals (name) VALUES ('Kangaroo');

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM animals;

+----+----------+

| id | name |

+----+----------+

| 1 | dog |

| 3 | penguin |

| 5 | whale |

| 7 | Horse |

| 8 | Kangaroo |

+----+----------+

5 rows in set (0.00 sec)

在插入新数据后,原来被删除的序列已经不再重复使用了,而下一个序列为未使用的最小整数。删除当前行对于下一次序列的分配,没有影响。

对于每次数据进行插入,都会从AUTO_INCREMENT列中获取最大值,在进行偏移量增加。如默认的偏移量为1.

...

✨ 接下来内容请点击【原文】进行查看~

更多数据库相关内容,可访问【墨天轮】进行浏览。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值