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

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

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

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

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语句提出去放到游标声明语句里面就好了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

MySQL性能优化的21条经验

1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被...

32980
来自专栏*坤的Blog

mysql生成百万级数量测试数据

1.4K30
来自专栏杨建荣的学习笔记

一个SQL语句引发的ORA-00600错误排查(二)(r9笔记第65天)

继昨天一个SQL语句导致的ORA-00600错误之后,我给出了背景和初步的分析结果,今天来给出我的结论,当然说明原因不是我的本意,还有反思。 首先语句类似这样的...

41670
来自专栏性能与架构

Mysql 5.7 的‘虚拟列’是做什么?

Mysql 5.7 中推出了一个非常实用的功能 虚拟列 Generated (Virtual) Columns 对于它的用途,我们通过一个场景来说明 假设有一...

42960
来自专栏数据和云

一个不懂业务的DBA不是好的DBA

编辑手记:懂业务,懂系统逻辑,你才能做一个更好的DBA。 在数据库巡检中发现一个MES生产信息数据库中一个存储过程中一条SQL单次逻辑读为2100,且执行很频繁...

31160
来自专栏架构师之路

InnoDB,5项最佳实践,知其所以然?

第一篇,说说MySQL两个最常用的存储引擎,MyISAM和InnoDB。照自己的理解,把一些知识点总结出来,不只说知识点,多讲“为什么”。 一、关于count...

11120
来自专栏性能与架构

这个sql为什么没有用到索引

用户users 表中对 create_time 字段建有索引 现在查询某个时间段的用户,通过explain发现下面这个sql 没有用到索引 explain ...

35350
来自专栏java一日一条

MySQL 性能优化的最佳 20+ 条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的...

6120
来自专栏java一日一条

MySQL 性能优化的最佳 20+ 条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的...

11630
来自专栏PHP实战技术

MySQL性能优化的最佳20+条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事...

392120

扫码关注云+社区

领取腾讯云代金券