更新时间:2023-05-30 来源:黑马程序员 浏览量:
MySQL的自增主键(Auto Increment)并不一定是连续的,这是由于MySQL的实现方式以及一些特殊情况所导致的。
下面是一个简单的代码演示,展示了MySQL自增主键可能不是连续的情况:
-- 创建一个示例表 CREATE TABLE example ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); -- 插入一些数据 INSERT INTO example (name) VALUES ('John'); INSERT INTO example (name) VALUES ('Jane'); -- 查看插入后的数据 SELECT * FROM example;
输出结果可能如下所示:
+----+------+ | id | name | +----+------+ | 1 | John | | 2 | Jane | +----+------+
可以看到,自增主键的值分别为1和2,没有出现断层,是连续的。但在一些特殊情况下,自增主键可能不是连续的。下面是一些可能导致不连续的情况:
如果从表中删除了一些行,自增主键的值不会重新填补已删除的空缺,而是保持原样。例如,删除id为1的行后,下一次插入的记录的主键值将为3,而不是2。
-- 删除id为1的行 DELETE FROM example WHERE id = 1; -- 插入一条新的记录 INSERT INTO example (name) VALUES ('Bob'); -- 查看插入后的数据 SELECT * FROM example;
输出结果:
+----+------+ | id | name | +----+------+ | 2 | Jane | | 3 | Bob | +----+------+
如果在一个事务中插入了一条记录,但事务回滚了,该记录的自增主键值也会被跳过,不会继续使用。
-- 开启事务 START TRANSACTION; -- 插入一条记录 INSERT INTO example (name) VALUES ('Alice'); -- 回滚事务 ROLLBACK; -- 插入一条新的记录 INSERT INTO example (name) VALUES ('Charlie'); -- 查看插入后的数据 SELECT * FROM example;
输出结果:
+----+--------+ | id | name | +----+--------+ | 2 | Jane | | 4 | Charlie| +----+--------+
可以看到,因为事务回滚了,id为3的记录被跳过,下一次插入的记录的主键值为4。
这些情况都导致了自增主键的间断,使其不是连续的。虽然自增主键的设计初衷是为了保证唯一性和简化数据访问,但并不保证连续性。如果需要连续的自增主键,可以考虑使用其他的方式或算法来生成主键值。