1、現(xiàn)在創(chuàng)建游戲角色的時(shí)候,基本上都是支持角色名字隨機(jī)的,以前此功能在客戶端用代碼實(shí)現(xiàn),然后向服務(wù)器請(qǐng)求并驗(yàn)證,后來(lái)發(fā)現(xiàn)有時(shí)候連續(xù)幾次都失敗,所以改成在服務(wù)器實(shí)現(xiàn)。實(shí)現(xiàn)方法主要考慮使用mysql隨機(jī)查詢記錄,在網(wǎng)上查了很多方案,然后用在了我們游戲中。
實(shí)現(xiàn)方案是,將所有隨機(jī)名字都插入到一張表中,然后從中隨機(jī)取一條當(dāng)前角色表中沒(méi)有出現(xiàn)過(guò)的名字。
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
因?yàn)閷?duì)mysql沒(méi)有深入研究過(guò),在實(shí)踐的過(guò)程中發(fā)現(xiàn)游標(biāo)操作只能修改一條數(shù)據(jù),后來(lái)查了很多資料,還是解決了問(wèn)題,自己也學(xué)到了一點(diǎn)知識(shí),修改后存儲(chǔ)過(guò)程如下:
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;
A:SELECT INTO 語(yǔ)句或 INSERT 語(yǔ)句的子查詢的結(jié)果為空表。
B:在搜索的 UPDATE 或 DELETE 語(yǔ)句內(nèi)標(biāo)識(shí)的行數(shù)為零。
C:在 FETCH 語(yǔ)句中引用的游標(biāo)位置處于結(jié)果表最后一行之后。
后來(lái)把select語(yǔ)句提出去放到游標(biāo)聲明語(yǔ)句里面就好了。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com