JSP里是否有mysql_insert_id()或类似功能的函数?(解决就给分)

楼主nonamexz(无名小卒)2005-12-22 18:01:06 在 Java / Web 开发 提问

CREATE   TABLE   `message`   (  
  `msgPID`   int(10)   NOT   NULL   auto_increment,  
  `msgType`   varchar(10)   default   NULL,  
  `msgSubject`   varchar(100)   default   NULL,  
  `msgBody`   blob,  
  `msgSender`   varchar(100)   default   NULL,  
  `fileList`   blob,  
  `sendDate`   varchar(20)   default   NULL,  
  PRIMARY   KEY     (`msgPID`)  
  )   TYPE=MyISAM  
   
   
  CREATE   TABLE   `personalmsg`   (  
  `personalMsg`   int(10)   NOT   NULL   auto_increment,  
  `msgPID`   int(10)   NOT   NULL   default   '0',  
  `userPID`   int(10)   default   NULL,  
  `msgType`   int(1)   default   NULL,  
  `statusMsg`   int(1)   default   NULL,  
  PRIMARY   KEY     (`personalMsg`)  
  )   TYPE=MyISAM  
   
   
  在做消息发布的时候遇到的问题,记得在PHP中有一个mysql_insert_id能取到最近一次执行insert语句生成记录的ID,但在我JSP里一直没找到这个或有类似功能的函数,请高手指点,不胜感激。  
  问题点数:100、回复次数:7Top

1 楼funcreal(为中华之崛起而编程)回复于 2005-12-22 19:40:28 得分 10

以我的经验,没有这个东西。  
   
  你在事务里做一下吧,要记着加个锁Top

2 楼bluemoon0001(小天--追梦浪子)回复于 2005-12-23 09:05:57 得分 40

为什么非要用系统自动增量做ID呢?这种做法有很多蔽端,我想只要你是长写程序的都应该能体会到的。  
   
  另外提供两种做ID的方式:  
   
  1、用一张表(autoTableId)专门用来记录其它表中的ID,改表的字段为     tabelname   maxid  
        在jsp中写个函数,或者是类,专门用来提取其它表的最大ID  
        当你在另一个表(例如:user表)中插入数据前   先用user做为tabelname的搜索条件在表autoTableId中搜索  
        如果的不到那就在表autoTableId   插入一条tabelname为user   、maxid为1的记录,这时你的取ID的函数反回的就是1,也就是user表中要用到的ID  
        如果找到了那就先把原maxid加1保存到autoTableId表中,在把加1后的maxid作为函数的返回值,也就是也就是user表中要用到的ID  
         
        用这种方式作ID应该说绝没有问题,这样同时也就解决了,你取不到新插入记录ID的问题,这种方式在我用asp做的OA中用到过。  
   
  2、用字符串作表的ID:  
        自己写个函数用来生成一个永不重复的字段串,原理,你可以用日期时间   再加上随机数,这样ID重复的机率几乎为0  
        例:2005-12-23   8:56:23     此时再加上一个0~9   a~z的5位或6位随机组合(或者是1到1000的一个随机数),这样生成的ID就可能是:2005122385623a4b8zx   等,这样重复的可能性几乎为0,我用asp做一般网站,用的就是这种方法生ID的。  
   
      用这种方法同样也能解决你说的那个问题了。  
   
  总结:自己生成ID比数据库自动生成ID要灵活方便的多。Top

3 楼dduyong(polestar)回复于 2005-12-23 09:35:32 得分 10

晕。这么傻的问题。hibernate会在每save一条的记录的时候返回一个主键的对象给你。  
  在你这里就是一个Integer的msgPIDTop

4 楼nonamexz(无名小卒)回复于 2005-12-23 11:31:57 得分 0

我已经找到解决方法了。  
  用mysql自带的select   last_insert_id()就可以了。Top

5 楼bluemoon0001(小天--追梦浪子)回复于 2005-12-23 12:55:41 得分 20

这种方法是可以,但是有没有考虑到,同时性噢,如果恰好,在你插入一条记录之后,提取最新ID之间,刚好这个时候别人又插入一条件的数据,这时候提取的就是别人插入记录的ID噢,不过也许用事务处理可以解决这个问题噢。Top

6 楼nonamexz(无名小卒)回复于 2005-12-23 16:38:30 得分 0

last_insert_id()最后产生的   ID   是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。所以,bluemoon0001(小天--追梦浪子)所说的问题是不会出现的。Top

7 楼ChDw(米)回复于 2005-12-23 17:03:27 得分 20

你也可以在调用executeUpdate时候增加参数   Statement.RETURN_GENERATED_KEYS    
  然后getGeneratedKeys()   获得Top

你可能对以下的问题也比较感兴趣....