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

nonamexz 2005-12-22 06:01:06
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里一直没找到这个或有类似功能的函数,请高手指点,不胜感激。
...全文
230 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluemoon0001 2005-12-23
  • 打赏
  • 举报
回复
这种方法是可以,但是有没有考虑到,同时性噢,如果恰好,在你插入一条记录之后,提取最新ID之间,刚好这个时候别人又插入一条件的数据,这时候提取的就是别人插入记录的ID噢,不过也许用事务处理可以解决这个问题噢。
nonamexz 2005-12-23
  • 打赏
  • 举报
回复
我已经找到解决方法了。
用mysql自带的select last_insert_id()就可以了。
究极装配 2005-12-23
  • 打赏
  • 举报
回复
晕。这么傻的问题。hibernate会在每save一条的记录的时候返回一个主键的对象给你。
在你这里就是一个Integer的msgPID
bluemoon0001 2005-12-23
  • 打赏
  • 举报
回复
为什么非要用系统自动增量做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要灵活方便的多。
ChDw 2005-12-23
  • 打赏
  • 举报
回复
你也可以在调用executeUpdate时候增加参数 Statement.RETURN_GENERATED_KEYS
然后getGeneratedKeys() 获得
nonamexz 2005-12-23
  • 打赏
  • 举报
回复
last_insert_id()最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。所以,bluemoon0001(小天--追梦浪子)所说的问题是不会出现的。
funcreal 2005-12-22
  • 打赏
  • 举报
回复
以我的经验,没有这个东西。

你在事务里做一下吧,要记着加个锁

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧