mysql的问题,大家看一下嘛,谢谢

mysql方面的
第一题:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15

第二题:还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA程序里面获得这条记录的ID.
[b]问题补充:[/b]

18,因为你没有把mysql归0

但是那个面试我的人告诉我是15啊。。
还有MYSQL怎么归0啊
[b]问题补充:[/b]
第一题,面试的人告诉我的说是15,还是这个是MYSQL的XX机制,还说MYSQL可能会才产XX数据的原因所在
[b]问题补充:[/b]

面试的人不一定技术都是很厉害的,我最烦的是那些SB从网络抄一题,自己都没有验证过,来考应聘人员。。。我是这么认为,这么多年来,经历那么多面试,真正懂技术没有几个,真正能够和他谈技术的,我的印象中仅一人。

哇,我去验证下嘛,是不是MYSQL版本的问题呢?有的版本就是15有的版本就是18呢。。。还有MYSQL是要重启的,重启了之后再INSERT
[b]问题补充:[/b]
人家是是把MYSQL重启啊,不是把表truncate t_test;
[b]问题补充:[/b]
谢谢大家。。。。
[b]问题补充:[/b]
wcily123大哥,我说了,删了数据之后,[color=red]MYSQL要重启啊。。。[/color]
[b]问题补充:[/b]
如果表的类型是MyISAM,那么是18。
因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。

如果表的类型是InnoDB,那么是15。
InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。
(防止因OPTIMIZE操作丢失最大ID的方法,我写了一篇博客,请参看http://ilgnep.iteye.com/blog/317343)

个人感觉,使用的InnoDB的多一些。

MyISAM表和InnoDB表怎么创建,怎么看表是InnoDB还是MyISAM

[b]问题补充:[/b]
[color=red]MyISAM表和InnoDB表怎么创建,怎么看表是InnoDB还是MyISAM [/color]
[b]问题补充:[/b]
晕了,去MYSQL官方看了一下,就一个表,就有这么多的类型啊。。。

[img]/upload/attachment/97387/25c4663f-77d0-3513-903c-3246d4cda874.jpg[/img]
。。。。。。
[b]问题补充:[/b]
http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
[b]问题补充:[/b]
第一题:这个要看Mysql表的类型
我现在知道的有两种,一种是MyISAM,另一种是InnoDB
MYSQL默认的就是InnoDB
InnoDB是把表的主键最大值放到内存里面,所以MYSQL重启之后就会丢失(在WINDOW下,这是MYSQL默认的)
MyISAM是把表的主键最大值放到文件里面,所以MYSQL重启之后不会丢失

可以在创建表的时候显示指定
[code="sql"]create table t_test(id int not null auto_increment primary key,name varchar(255)) ENGINE=InnoDB;


create table t_test(id int not null auto_increment primary key,name varchar(255)) ENGINE=MyISAM;[/code]

还可以通过
[code="sql"]SHOW TABLE STATUS;[/code]命令可以看到表的类型

使用ALTER命令可以对单个表的类型进行修改
[code="sql"]ALTER TABLE talbe_name ENGINE=InnoDB; [/code]


[code="sql"]SHOW GLOBAL VARIABLES LIKE '%engine%';[/code]
可以看到MySQL当前默认的新生成表的类型。

第二题:
有两种方法,
1.JDBC有这个API,Statement.getGeneratedKeys();
2.可以利用MySQL语句获得,但这个就不是通用语句了:SELECT LAST_INSERT_ID();

以上是总结,大家看一看有什么问题没有,谢谢大家了,那个MySQL-Front 就算了嘛,我要的话我去网上搜一下就应该下载的到啥。。

感谢所有网友

在这里还要特别感谢:
huangnetian,hantsy,lovewhzlq,LucasLee,wcily123,秦朝古月等等
[b]问题补充:[/b]
http://langhua9527.iteye.com/blog/374113

如果表的类型是MyISAM,那么是18。
因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。

如果表的类型是InnoDB,那么是15。
InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。
(防止因OPTIMIZE操作丢失最大ID的方法,我写了一篇博客,请参看http://ilgnep.iteye.com/blog/317343)

个人感觉,使用的InnoDB的多一些。

第二题,有点没有读懂题目。如果你能确保你INSERT的是最后一条(在查询之前没有再次INSERT),可以用'select * from talbe_name order by id desc limit 1;'来获得。

18,因为你没有把mysql归0

mysql 里目前不支持获得当前的id,orcale里支持.所以如果是这样的话,你就不能用自增长的了,而要用uuid

1.再insert一条记录,这条记录的ID是15 ,
msql重启后,table的AUTO_INCREMENT会变成max(id)+1

  1. 看看这文章 http://www.360doc.com/content/050810/08/677_5255.html

第一题,18, mysql 内部有日志系统,会记录你的操作。除你是用truncate语句清除所有记录,它同时也会清除日志,这样生成id也会从1开始。
第二题,JDBC 规范中已经相关的操作,可以取得insert语句生成的id,PreparedStatement中已经有一个方法,getGeneratedKeys(),这个依赖数据库自动生成机制,可以直接刚刚插入记录的id。

自己验证一下就知道了。。。

面试的人不一定技术都是很厉害的,我最烦的是那些SB从网络抄一题,自己都没有验证过,来考应聘人员。。。我是这么认为,这么多年来,经历那么多面试,真正懂技术没有几个,真正能够和他谈技术的,我的印象中仅一人。

[code="java"]
[hantsy@localhost Desktop]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.33 MySQL Community Server (GPL) by Remi

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| GUESTBOOK |
| MyBusinessRecords |
| bakesale |
| cakeblog |
| cheesecake2 |
| drupal_db |
| exam |
| gallery2 |
| gift |
| hibernatedemo |
| mysql |
| petcatalog |
| sakila |
| sample |
| test |
| travel |
| vir |
+--------------------+
18 rows in set (0.20 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table t_test(id int not null auto_increment primary key,name varchar(255));
Query OK, 0 rows affected (0.05 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t_test |
+----------------+
1 row in set (0.00 sec)

mysql> desc t_test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.05 sec)

mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.03 sec)

mysql> insert into t_test(name) values('test2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_test(name) values('test3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_test;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 2 | test2 |
| 3 | test3 |
+----+-------+
3 rows in set (0.00 sec)

mysql> delete from t_test where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> delete from t_test where id=2;
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_test(name) values('test3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_test;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 4 | test3 |
+----+-------+
2 rows in set (0.00 sec)

mysql> truncate t_test;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_test;
Empty set (0.00 sec)

mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_test(name) values('test2');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_test;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

mysql>

[/code]

这是刚刚是操作。。。

[code="java"]
mysql> use test;
Database changed
mysql> create table t_test(id int not null auto_increment primary key,name varchar(255));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t_test(name) values('test');

Query OK, 1 row affected (0.00 sec)

mysql> insert into t_test(name) values('test2');

Query OK, 1 row affected (0.00 sec)

mysql> insert into t_test(name) values('test3');

Query OK, 1 row affected (0.00 sec)

mysql> select * from t_test;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 2 | test2 |
| 3 | test3 |
+----+-------+
3 rows in set (0.00 sec)

mysql> delete from t_test where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> \q
Bye
[hantsy@localhost NetBeansProjects]$ sudo /etc/init.d/mysqld restart
[sudo] password for hantsy:
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
[hantsy@localhost NetBeansProjects]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.33 MySQL Community Server (GPL) by Remi

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

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> insert into t_test(name) values('test3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_test;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 2 | test2 |
| 4 | test3 |
+----+-------+
3 rows in set (0.00 sec)

mysql>

[/code]

我的重启之后是15,这个问题以前没想过啊,哈

根据版本不一样,会有不一样的结果

第一题确实是15

我3.23用到现在。。。都没有听说过这种事情。
除非你使用哪个版本恰好是有问题的。

有可能是话,是修改了默认配置。
比如 store engine(MySQL 支持很多种,一般我java开发只会用InnoDB)等,那个就变数太多了。

还有就是系统平台产生的差别,至少在linux下,我可以确定使用MyISAM,InnoDB是不可能的。

第一题就挺无聊的,我也不清楚答案;
第二题我倒是知道,
有两种方法,
1.JDBC有这个API,Statement.getGeneratedKeys()
2.可以利用MySQL语句获得,但这个就不是通用语句了:SELECT LAST_INSERT_ID();

别忘了给我分呀,呵呵,请早日结贴

确实是18,自增长

第一题 : 18
第二题:SQL = select id,name from table where 条件匹配

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
conn = DriverManager.getConnection(url, user, password);

ResultSet rs = null;
Statement st = null;
st = conn.createStatement();
rs = st.executeQuery(sql);
while (rs.next()) {

int id = rs.getInt(1)//这个是你想要的ID

}

肯定是从15开始的

今天翻阅了mysql手册,没有找到任何重启MySQL后,auto_increment计算会以max+1开始的依据。。。
上面我已经演示了重启的情况,依然和我说的一样。
这是我在JavaEye有史以来最无聊的问题。
至于那SB面试的人为什么说是15,就无从说起了。

我没用过mysql,我想因该是15
重启之前把数据保存了,重启后再插入因该是接着自增长.

[quote]mysql方面的
第一题:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 [/quote]
[color=red]18[/color]
mysql主键生成过了就不会在生成一样的了,要不你就归零
个人觉得:是考虑的并发访问才搞成那个样子的,数据库是一个共享的资源很多人都会去访问他对他进行操作,所以的他自动主键生成机制不会受到delete,update等操作的影响,他只受到insert的影响,且每次insert后他都会生成全局唯一自增的一个值!

我的版本 version: 5.0.18-nt
环境 Wondows
试了第一题 事实是出现的是 15,试了同事的电脑也是15.

[code="sql"]
D:\Documents and Settings\Administrator>mysql -uroot -p
Enter password: ***
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.32-community MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| daotest |
| drp |
| edu |
| hibernate_frist |
| hibernate_many2many |
| hibernate_session |
| mysql |
| test |
+---------------------+
9 rows in set (0.11 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.02 sec)

mysql> create table t_test(
-> id int not null auto_increment primary key,
-> name varchar(50));
Query OK, 0 rows affected (0.14 sec)

mysql> insert into t_test values('test');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.05 sec)

mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.03 sec)

mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.02 sec)

mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_test;
+----+------+
| id | name |
+----+------+
| 1 | test |
| 2 | test |
| 3 | test |
| 4 | test |
+----+------+
4 rows in set (0.02 sec)

mysql> delete from t_test where id=4;
Query OK, 1 row affected (0.03 sec)

mysql> delete from t_test where id=3;
Query OK, 1 row affected (0.03 sec)

D:\Documents and Settings\Administrator>mysql -uroot -p
Enter password: ***
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.32-community MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use test;
Database changed
mysql> insert into t_test(name) values('test');
Query OK, 1 row affected (0.02 sec)

mysql> select * from t_test;
+----+------+
| id | name |
+----+------+
| 1 | test |
| 2 | test |
| 5 | test |
+----+------+
3 rows in set (0.00 sec)

mysql>[/code]

我上面已经贴了重启的例子,难道看不到吗。。。
为什么还在这个问题纠缠不清,

看来windows平台也一样的结果了。

我这里的情况就是这样的!
我一开始觉得可能和 mysql> set autocommit=true; 这个有关系可是我是试验了,
mysql> set autocommit=off;结果是还我想的那样!

我就觉得啊!你可以这样想想 如果你要是 delete的是 15,16, 没有 delete 17
mysql要怎么处理?

我也兴趣的实验了一下,果然是从15开始的

我认为应该是18.

也是设置某些项。

删除日志什么的可以是15.

选择好DB后,用'SHOW TABLE STATUS;'命令可以看到表的类型。每个表可以分别设置这个属性。使用ALTER命令可以对单个表的类型进行修改'ALTER TABLE talbe_name ENGINE=InnoDB;'
用'SHOW GLOBAL VARIABLES LIKE '%engine%';'可以看到MySQL当前默认的新生成表的类型。

这5分真难拿呀。要不是急着在论坛发表帖子,是不会来回答问题的。
还好,找到方法可以把我的论坛积分换成问答积分了。

一般的编辑器都能直接看到的,比如MySQL-Front
这个工具很好,如果你没有,我可以发给你

搞懂MyISAM和InnoDB,足够90%情况的使用了。其余的一般情况下用不到,了解的也相对少很多。真正等你用到的时候再去调查就好了。

InnoDB 他的性能不如InnoDb,但是它支持事务
MyISAM 性能很快,但不支持事务.

一般的网站对性能要求很高的项目,一般会用后者

innoDB还是MyISAM ,在有编辑器创建时就能看见和设置的,
比如MySQL-Front,挺不错的,如果你没有,我发一份给你

MySQL-front是开源的吗?
mysql提供了三大工具(browser, administrator, workbench),其它都觉得没有必须,在这之前都是command解决。

18,因为即使你删除了15、16、18,但是它们也存在过你的数据库中,那么就有对他们的记录,不过这是数据库内部的处理机制决定的。这样你删除它了之后即使内容被删除了,但是当你再往里面添加数据的时候,那么这条数据一定是从你删去数据的最后一条开始加的。