1. MySQL索引是0基
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` (`name`) VALUES ('Tom'); INSERT INTO `test` (`name`) VALUES ('Jerry'); INSERT INTO `test` (`name`) VALUES ('Lucy'); SELECT * FROM `test` WHERE `id` = 0;
在这种情况下,MySQL的AUTO_INCREMENT的起始编号从0开始,但是为了增强可读性,在查询语句中使用的编号从1开始。
2. MySQL索引是1基
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` (`name`) VALUES ('Tom'); INSERT INTO `test` (`name`) VALUES ('Jerry'); INSERT INTO `test` (`name`) VALUES ('Lucy'); SET @@SESSION.sql_mode='NO_AUTO_VALUE_ON_ZERO'; INSERT INTO `test` (`id`,`name`) VALUES (0,'Andy'); SELECT * FROM `test` WHERE `id` = 1;
在这种情况下,MySQL的AUTO_INCREMENT的起始编号从1开始,同时在查询语句中使用的编号也从1开始,不需要进行任何的偏移。
总的来说,MySQL索引到底是0基还是1基,取决于用户在创建表时指定的AUTO_INCREMENT值,也就是说,MySQL可以同时支持基于0和1的索引起始编号。这个取值在创建表时被指定,一旦表被创建了,就无法再次修改AUTO_INCREMENT的值。