langhua9527
langhua9527
2009-04-22 13:26
采纳率: 0%
浏览 600
已采纳

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

38条回答 默认 最新

  • ilgnep2009
    秦朝古月 2009-04-24 14:19
    已采纳

    如果表的类型是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;'来获得。

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-22 13:32

    18,因为你没有把mysql归0

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-22 13:33

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

    点赞 评论
  • wanghaolovezlq
    wanghaolovezlq 2009-04-22 13:35

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

    1. 看看这文章 http://www.360doc.com/content/050810/08/677_5255.html
    点赞 评论
  • hantsy
    hantsy 2009-04-22 13:47

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

    点赞 评论
  • hantsy
    hantsy 2009-04-22 13:52

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

    点赞 评论
  • hantsy
    hantsy 2009-04-22 13:54

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

    点赞 评论
  • hantsy
    hantsy 2009-04-22 14:10

    [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]

    点赞 评论
  • hantsy
    hantsy 2009-04-22 14:13

    这是刚刚是操作。。。

    点赞 评论
  • hantsy
    hantsy 2009-04-22 23:11

    [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]

    点赞 评论
  • wei_jing
    wei_jing 2009-04-23 00:20

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

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-23 08:39

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

    点赞 评论
  • iteye_2555
    iteye_2555 2009-04-23 08:52

    第一题确实是15

    点赞 评论
  • hantsy
    hantsy 2009-04-23 08:54

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

    点赞 评论
  • hantsy
    hantsy 2009-04-23 09:36

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

    点赞 评论
  • hantsy
    hantsy 2009-04-23 09:40

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

    点赞 评论
  • superbible_cs
    清流穿林 2009-04-23 10:04

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

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-23 11:54

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

    点赞 评论
  • meilidemeng
    meilidemeng 2009-04-23 13:01

    确实是18,自增长

    点赞 评论
  • java_pop
    java_pop 2009-04-23 15:31

    第一题 : 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
    

    }

    点赞 评论
  • iteye_15036
    iteye_15036 2009-04-23 15:45

    肯定是从15开始的

    点赞 评论
  • hantsy
    hantsy 2009-04-23 17:59

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

    点赞 评论
  • haidege
    haidege 2009-04-24 04:04

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

    点赞 评论
  • stefan321
    stefan321 2009-04-24 09:43

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

    点赞 评论
  • iteye_2555
    iteye_2555 2009-04-24 09:59

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

    点赞 评论
  • stefan321
    stefan321 2009-04-24 10:10

    [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]

    点赞 评论
  • hantsy
    hantsy 2009-04-24 10:15

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

    点赞 评论
  • hantsy
    hantsy 2009-04-24 10:16

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

    点赞 评论
  • stefan321
    stefan321 2009-04-24 10:20

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

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

    点赞 评论
  • xiejin2008
    xiejin2008 2009-04-24 11:38

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

    点赞 评论
  • lndalian200
    lndalian200 2009-04-24 15:45

    我认为应该是18.

    也是设置某些项。

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

    点赞 评论
  • ilgnep2009
    秦朝古月 2009-04-24 16:02

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

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

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-24 16:13

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

    点赞 评论
  • ilgnep2009
    秦朝古月 2009-04-24 16:43

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

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-24 17:04

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

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

    点赞 评论
  • weixin_42297497
    weixin_42297497 2009-04-24 17:06

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

    点赞 评论
  • hantsy
    hantsy 2009-04-24 21:19

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

    点赞 评论
  • yincaiqin
    yincaiqin 2009-04-25 16:44

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

    点赞 评论

相关推荐