• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL

mysql 搞代码 4年前 (2022-01-09) 22次浏览 已收录 0个评论

最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘。

1、现在创建游戏角色的时候,基本上都是支持角色名字随机的,以前此功能在客户端用代码实现,然后向服务器请求并验证,后来发现有时候连续几次都失败,所以改成在服务器实现。实现方法主要考虑使用mysql随机查询记录,在网上查了很多方案,然后用在了我们游戏中。

本文来源gao!daima.com搞$代!码网

实现方案是,将所有随机名字都插入到一张表中,然后从中随机取一条当前角色表中没有出现过的名字。

BEGIN			DECLARE randnum int DEFAULT 0;	SELECT FLOOR(RAND() * 309034) INTO randnum;	SELECT rname INTO _name FROM `names` WHERE ((_sex = sex) AND		(rname not in (SELECT Name FROM longwen.player WHERE _world = WorldID)) AND		(id > randnum)) LIMIT 1;			set returnvalue = 0;END

2、接运营的需求,有时候因为服务器维护,需要给所有玩家送一些东西,这时候涉及离线玩家,所以我们的方案是静态写数据库。

因为对mysql没有深入研究过,在实践的过程中发现游标操作只能修改一条数据,后来查了很多资料,还是解决了问题,自己也学到了一点知识,修改后存储过程如下:

DECLARE _cursor CURSOR FOR SELECT RoleID FROM player WHERE (RoleID NOT IN (SELECT roleID FROM email where LENGTH(datas)  0)); DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set _done = 1;OPEN _cursor;  set _done = 0;REPEAT	FETCH _cursor into _roleId;	replace into email(roleID, datas) values(_roleId, 'test');UNTIL _done END REPEAT;CLOSE _cursor;

修改前repeat里面有一条select语句。出现这个问题,主要是对SQLSTATE理解不够,02000异常有3种条件:

A:SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。

B:在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。

C:在 FETCH 语句中引用的游标位置处于结果表最后一行之后。

后来把select语句提出去放到游标声明语句里面就好了。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址