您的位置:首页 > 数据库 > MySQL

错误的触发器和正确的存储过程--mysql

2009-05-29 20:07 281 查看
在做一个网站时有一个网站计数功能,因为不想再请求页面时有太多数据库操作,于是想用trigger实现。下面是我写的trigger:

delimiter $$

create trigger count_bi before insert on cs_count

for each row

begin

if not exists(select * from cs_count where dat=new.dat)then

insert into cs_count values(new.dat,new.cnt);

else

update cs_count set cnt=cnt+1 where dat=new.dat;

end if;

end$$

delimiter ;

这个trigger语法上没什么错误,但是逻辑上有问题:如果数据库表中没有记录,就会执行insert操作,然后执行insert时表中还是没有该记录,因此又会触发trigger,因此是一个无限循环。。

因此用存储过程来实现了。。下面是我写的procedure:

delimiter $$

create procedure visitor_num(in d date)

begin

if not exists(select * from cs_count where dat=d)then

insert into cs_count values(d,1);

else

update cs_count set cnt=cnt+1 where dat=d;

end if;

end$$

delimiter ;

这个是正确的。。。

这是第一次用这些数据库对象。。。遇到不少麻烦。。

下面说下:

1、procedure的程序体应该总是以begin开始,以end结束。。除非只有一个sql语句。。

2、DBMS在处理创建子程序的时候遇到一个;就会认为子程序结束,因此在创建之前应该用delimiter命令改变sql语句结束符号。还有这个命令的作用是在创建子程序的(临时)时候告诉DBMS不把;作为结束符号,在用call 调用子程序的时候无需考虑用delimiter命令。。

3、还有当时写这个子程序时对end$$有些不理解,认为不需要带个$$,直接end应该就可以。首先这是错的,其实这也不用考虑,但我这个人爱转牛角尖。现在明白了,这个是用来告诉DBMS处理子程序的时候处理到这个地方就结束(认为以$$为语句分隔符的状态),然后再后面delimiter;就可以了。。

两件事情要多老天说:

1、每次在我严重受挫准备奋起直追,百倍努力的时候,你总是会给我暗示让我沾沾自喜,认为自己不是那么的垃圾。请不要这样子,每个人应该都有虚荣心,只是自己克制程度不同而已,当然我不是给我的虚荣系找借口,只是我没办法一下子消除我的虚荣心。

2、每次在我稍微有些进步的时候请不要让我自以为有些本事了,自以为是。其实我已经准备好我将来和将来的将来要做生么了,我也知道这意味着什么,我认为从长远打算来说这不是好心态。。

好了,加油。。

还有今天第一次对自己的选择产生了畏惧感,那时真的害怕了,貌似还有了退缩的念头,认为这太恐惧了,面对这个庞然大物东西我的能力简直渺小的不起眼,真的害怕了,第一次,真的是第一次。是在pear网站上找代码时,主要是自己没有条理的认识,不知道要找的东西是怎么回事,只知道有个pear库,脑子里有两个选择:一个是pear是个一个整体,一次下载下来的是全部pear的代码,什么db啦,mail啦...都是一个文件里面的;第二个是pear对每个模块分别下载,因为我是在看手册时来看看的。迷迷糊糊下了几个,简单的看了一下,应该和我第二个想法一样。和看西班牙语一样,还有前几天一样下了个jquery,也是什么也看不明白,只不过那时候没产生这种感觉。

恐惧的另一个原因是我在群里问关于php发送邮件的时,有人告诉我用socket,虽然以前看java时看到过这个概念,但只是脑子里有这个概念,不知道是怎么回事,这会产生恐惧时我感觉与别人落后太对了,况且还有很多东西去学,不知道和何年何月能达到目标。。。

今天太奢侈了,我很久没写过日志了,今天虽然只写了区区几个字,但是还是象刚刚写了篇小说。。呵呵。算了,不瞎扯了。

但有一件事情是确定的,今天的恐惧是暂时的,我的选择是不会变的,即使其那面困难丛丛。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: