数据库学习第一步 Mysql 量表计分系统的实行

本文介绍了在MySQL中创建并实现一个量表计分系统的经验,包括动态SQL的运用、处理更新安全问题、解决字符集乱码问题以及中点时间计算的挑战。通过权值表存储每个选项的权重,利用SELECT SUM()获取总分。在过程中遇到的错误如'Error Code: 1175'通过调整SQL_SAFE_UPDATES解决,字符集配置修改为UTF8,以及在处理多行记录时避免'Error: result consisted of more than one row'的错误。
摘要由CSDN通过智能技术生成

       起因是我们睡眠组做实验之前,需要被试者填一堆量表,诸如匹茨堡睡眠质量指数量表之类的,多半都是一堆选择题,每个题对应不同的权值,需要算最后的总分,boss让我弄这个,弄了两周后,差不多搞定,总结如下:

     被试者填的答案全部在以‘PartTwo’+他们的身份证号的表里(注意,这里并不是所有的信息在固定的一张表里,所以这也就导致了我后来需要使用动态SQL语句)字段名分别是 ID , formid (因为有很多表,分别按顺序排下来) ,questionid ,answer ;

     为了计算总分,我弄了一个权值表weight,字段名分别是ID ,formid ,qid, answer ,value ,在这张表里存进了每个选项对应的权值,然后通过select sum(value)得到总分,存储过程如下:

    

DELIMITER $$
CREATE DEFINER=`question`@`%` PROCEDURE `score`(in tname varchar(300),in formid2 int(4),out score int(10))
begin

SET @sqlcmd = CONCAT('select  sum(value) into @score  from  weight  a , ', tname, ' b  where a.qid=b.questionid and a.answer=b.answer and a.formid=',formid2,'and b.formid=',formid2);
prepare stmt from @sqlcmd;
execute stmt;
select  @score;
DEALLOCATE PREPARE stmt;

end
    输入分别是表名和表的ID,输出是总分。

     动态SQL:

    由于开始并不知道我要查询的表名是什么,所以需要用到动态SQL,当时是学习这位朋友的例子然后写的http://blog.csdn.net/chszs/article/details/5818363。

      更新安全问题:

    在更新表的内容时,会出现Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.” 这个错误
 要取消这个限制,可以: 
    SET SQL_SAFE_UPDATES=0;然后就可以正常更新了,当然重启服务器后还是会变回来,到时候记得再改就是。

      乱码与配置问题:

    这个困扰了我许久,其实到现在还是未彻底解决,只能说下学到了什么东西吧。http://blog.csdn.net/ACMAIN_CHM/article/details/4174186,这位朋友是csdn上mysql的版主,写的这个关于字符集乱码的文章十分到位,可以借鉴下。

      这里说几个小问题,一个是关于配置的,mysql已经到5.7了,现在安装没有了之前配置字符集的选项,需要自己去my.ini(windows下)或者my.cnf(linux下)改,(my.ini在哪呢,最新的sql5.7默认会放在programdata中,而不是网上所说的安装直属文件夹里,win8系统下这个是隐藏的,所以可以在C盘搜索这个文件)具体的就是将my.ini中的default-character-set改成=utf8,还有mysqld中加一句character-set-server=utf8,这样当你“show variables like 'char%'”时,你就可以看到都是utf8了。

       修改完后需要重启服务,怎么重启呢,可以用附带的mysql notifier的restart,也可以进控制面板搜索服务,然后手动停止,启动。

        怎么确定你使用的是你修改的那个配置文件呢,我用的mysql workbench,在server菜单下找management access settings 然后找system profile里的configuration file就是了。顺便说一句,之所以为这个纠结了两天,就是因为我处理的是网站的数据库,奶奶的压根没用到这个配置文件,搞的我改了无数次my.ini发现压根一点作用没有。

       在改不了配置文件的情况下,要设置上面说的一堆为UTF8,用了一堆网上查的代码,其中character_set_server始终是Latin 1,最后无法用的set character_set_server=utf8这个命令,虽然重启服务后还是会变回来

       Error: result consisted of more than one row

     在写存储过程时出现了这个错误,是因为select into 语句有错误 ,得到的值有多行记录,如果像我一样明明需要得到的是一个值,那么就要思考是不是where后面的语句有错误了。当然如果你本来就是想查询多行记录,貌似需要用到光标。

        中点时间的计算

              这个是所有工作中花费时间最长的一个,并不是因为这个最难,而是因为自己见识浅薄,压根不知道sec_to_date这种函数,然后做了很多无用功。这个另外写一篇贴出来吧。

         这次的工作总结差不多就是这样,这阶段的工作让我知道很多东西还是需要靠经验积累,包括计总分的思路,某些特殊功能的函数,都是需要长久的学习才能掌握,希望自己能不断进步,也许过不了几天回头看,现在的自己有多么愚蠢,亦如找完BUG后骂写代码时的自己一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值