发现一个看似很简单的MySQL问题,却引起了大家的广泛关注:这是一道很早的面试题:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 。答案:如果表的类型是MyISAM,那么是18。
因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。
如果表的类型是InnoDB,那么是15。
InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。 自己也做了个实验,结果证实了上面的说法。真是惭愧啊,看似简单的问题自己也打错了。
- mysql> select * from test1;
- +----+-----------+
- | id | name |
- +----+-----------+
- | 1 | 陈兵辉 |
- | 2 | chen |
- | 3 | chen |
- | 4 | chen |
- | 5 | chen |
- | 6 | chen |
- | 7 | chen |
- | 8 | chen |
- | 9 | chen |
- | 10 | chen |
- | 11 | chen |
- +----+-----------+
- 11 rows in set (0.00 sec)
-
- mysql> delete from test1 where id in (10,11,9);
- Query OK, 3 rows affected (0.03 sec)
-
- mysql> show create table test1;
- CREATE TABLE `test1` (
- `id` int(11) NOT NULL auto_increment,
- `name` varchar(10) default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=<span style="color:#ff0000;">12</span> DEFAULT CHARSET=utf8 |
- mysql> exit;
- Bye
- [root@fsailing1 ~]# service mysqld restart
- 停止 MySQL: [确定]
- 启动 MySQL: [确定]
- [root@fsailing1 ~]# mysql -uroot -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or g.
- Your MySQL connection id is 2
- Server version: 5.0.95 Source distribution
- Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type "help;" or "h" for help. Type "c" to clear the current input statement.
-
- mysql> use test;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
-
- Database changed
- mysql> show create table test1;
- | CREATE TABLE `test1` (
- `id` int(11) NOT NULL auto_increment,
- `name` varchar(10) default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=<span style="color:#ff0000;">9</span> DEFAULT CHARSET=utf8 |
2,另外还有一个就是获取当前数据库表的自增字段数。
- mysql> select last_insert_id();
- +------------------+
- | last_insert_id() |
- +------------------+
- | 0 |
- +------------------+
- 1 row in set (0.00 sec)
Oracle job 学习Oracle数据库教程:ORA-01103错误解析相关资讯 MySQL数据库教程
- MySQL 处理非法数据 (04/09/2013 08:06:28)
- MySQL关于timestamp和mysqldump的 (12/16/2012 13:25:41)
- MySQL保证数据完整性 (12/16/2012 12:00:35)
| - ERROR 1130: mysql 1130连接错误的 (12/16/2012 13:29:08)
- MySQL数据库教程:管理数据库和表( (12/16/2012 12:47:02)
- MySQL快速插入大批量数据存储过程 (11/05/2012 19:04:04)
|
本文评论 查看全部评论 (0)