MySQL自增 为什么最后一行的值不是105而是106?

执行完以下代码后运行的结果:


INSERT INTO t17 
    VALUES (NULL, 'sql001@163.com', '001'),    -- 从1开始
    (NULL, 'sql002@163.com', '002'),
    (NULL, 'sql003@163.com', '003'),
    (100, 'sql100@163.com', '100'),
    (NULL, 'sql101@163.com', '101'),   -- 从101开始
    (NULL, 'sql102@163.com', '102'),   -- 102
    (50, 'sql050@163.com', '050'),
    (NULL, 'sql103@163.com', '103'),   -- 103
    (NULL, 'sql104@163.com', '104');   -- 104

SELECT * FROM t17;

img

在原来的基础上,执行完以下代码后运行的结果:


INSERT INTO t17
    (email, `name`) VALUES('sql105@163.com', '105');

SELECT * FROM t17;

img

以下为完整MySQL代码:


CREATE TABLE t17 (
    id INT PRIMARY KEY AUTO_INCREMENT,   -- 自增和主键搭配使用
    email VARCHAR(32) NOT NULL DEFAULT '',
    `name` VARCHAR(32) NOT NULL DEFAULT '');
    
INSERT INTO t17 
    VALUES (NULL, 'sql001@163.com', '001'),    -- 从1开始
    (NULL, 'sql002@163.com', '002'),
    (NULL, 'sql003@163.com', '003'),
    (100, 'sql100@163.com', '100'),
    (NULL, 'sql101@163.com', '101'),   -- 从101开始
    (NULL, 'sql102@163.com', '102'),   -- 102
    (50, 'sql050@163.com', '050'),
    (NULL, 'sql103@163.com', '103'),   -- 103
    (NULL, 'sql104@163.com', '104');   -- 104

INSERT INTO t17
    (email, `name`) VALUES('sql105@163.com', '105');
SELECT * FROM t17;
DROP TABLE t17;
  1. 为什么最后一行的id值不是从104自增到105,而是直接到106?

  2. 显示表格时,如何使id按照源代码排序?(即:按照1 2 3 100 101 102 50 103 104…的顺序排序)

在MySQL的自增机制中,如果表中定义了主键,每次向表中插入新数据时,自增的值会按照已有数据的最大主键值+1作为新的主键值。在这里,虽然在插入第4行数据时手动指定了主键为100,但由于后续插入了若干条自增主键数据,MySQL在计算自增主键值时会发现已有的最大主键为105,因此新插入的数据主键就是106。

要使id按照代码排序,可以使用ORDER BY和CAST函数,将name字段转换为整数进行排序,示例代码如下:

SELECT * FROM t17 ORDER BY CAST(`name` AS UNSIGNED);

其中,CAST(name AS UNSIGNED)表示将name字段转换为无符号整数。