读书人

有一个自动执行数据库更新的有关问题

发布时间: 2012-02-13 17:20:26 作者: rapoo

有一个自动执行数据库更新的问题,大哥们帮忙,小弟实在不懂了
--
-- 表的结构 `orderformlist`
--
CREATE TABLE `orderformlist` (
`oid` int(11) NOT NULL auto_increment,
`pid` int(11) NOT NULL default '0 ',
`uid` int(11) NOT NULL default '0 ',
`oCode` varchar(30) NOT NULL default ' ',
`pCode` varchar(30) NOT NULL default ' ',
`consignee` varchar(30) NOT NULL default ' ',
`address` varchar(255) NOT NULL default ' ',
`telephone` varchar(20) NOT NULL default ' ',
`mobileTelephone` varchar(20) NOT NULL default ' ',
`pName` varchar(30) NOT NULL default ' ',
`pSpecification` varchar(30) NOT NULL default ' ',
`pColor` varchar(20) NOT NULL default ' ',
`pUnits` varchar(10) NOT NULL default ' ',
`credits` decimal(10,0) NOT NULL default '0 ',
`pBarbarismPrice` decimal(10,2) NOT NULL default '0.00 ',
`unitPrice` decimal(10,2) NOT NULL default '0.00 ',
`amount` int(5) NOT NULL default '1 ',
`paymentMethod` varchar(255) NOT NULL default ' ',
`paymentGist` varchar(255) NOT NULL default ' ',
`estate` int(5) NOT NULL default '0 ',
`pHase` int(5) NOT NULL default '0 ',
`datetime` datetime NOT NULL default '0000-00-00 00:00:00 ',
`remark` varchar(60) NOT NULL default ' ',
`buyTime` datetime NOT NULL default '0000-00-00 00:00:00 ',
`congealEstate` int(11) NOT NULL default '0 ',
PRIMARY KEY (`oid`)
) TYPE=MyISAM AUTO_INCREMENT=14 ;


--
-- 表的结构 `accountlist`
--
CREATE TABLE `accountlist` (
`uid` int(5) NOT NULL auto_increment,
`credits` decimal(10,0) NOT NULL default '5 ',
KEY `uid` (`uid`)
) TYPE=MyISAM AUTO_INCREMENT=12 ;

--------------------------------
当orderformlist.estate字段的值被改为2的时候(0值表示预定单,1值表示正在送货,2值表示已到货并付款,3值表示已退订单),当orderformlist.estate字段的值被修改时,orderformlist.buyTime字段记录orderformlist.estate字段的修改时间,然后根据orderformlist.buyTime字段记录的修改时间至10天后把orderformlist.credits字段中的值加入accountlist.credits字段中,条件为orderformlist.uid=accountlist.uid,orderformlist.congealEstate字段中的值被改为1(0值表示没冻结,1值表示冻结)。如果10天之中orderformlist.estate字段的值从2被修改为其他值,那么
根据orderformlist.buyTime字段记录的修改时间至10天后把orderformlist.credits字段中的值加入accountlist.credits字段中条件为orderformlist.uid=accountlist.uid,orderformlist.congealEstate字段中的值被改为1的这一操作失效。如果当orderformlist.estate字段的值再次改为2时,orderformlist.buyTime重新记录修改时间。



PS:假设每天都会有用户的定订单的orderformlist.estate字段值被改为2或是从2值被改为其他值,这种情况是存在的。

我想实现的就是需要这一操作不是通过PHP程序在用户每次登入时去遍历用户orderformlist.estate字段值为2的订单,而是通过其他途径来解决对用户订单
检查,并对检查结果做其操作。
PHP + MySQL 4.0.1.2

[解决办法]
你的意思是定时执行这种程序来处理?


[解决办法]
建议,在orderformlist.estate字段的值被改变的时候,去判断,然后用php去处理数据库的内容,例如插入,更新数据什么的。
如果是mysql5.0 的话,也写个触发器,这样就能够楼主所说的自动。
具体的触发器如何写,要根据实际业务来定,触发器如何写,楼主看看帮助文档即可。

[解决办法]
我明白你的意思,你的是要实现将来时的自动数据转换。
我提到的方法不能实现,只能够实现当前的动作的。

要实现你的东西,最简单的解决办法就是添加任务(每过一段时间检测一下,看看有没有待处理的东西,如果结构组织好了,这个过程是很高效的),但是,MySQL本身没有任务的概念。唉,真麻烦。我再想想,先吃饭了。

楼主的 用户每次登入的时候用 的唯一缺点就是,用户登录的时间可能会比较长。

[解决办法]
现在好像的唯一方法,就是,从操作系统上增加一项任务,就是定点执行一个程序,该程序的功能就是调用一段存储过程,如果不支持存储过程,也可以把存储过程写在程序里面。

增加一个表,为这个程序使用。该表的是有一个时间字段,一个sql字段。

select id,sql from table where mytime=now()

然后用程序或者存储过程,执行每条sql,并执行玩该条sql后,自动从table表里面删除该行记录。

数据格式:
id time sql
1 2007-9-10 delete from t1 where ........;
2 2009-1-9 insert t2 ............;
3 2008-9-3 update ..............;
4 2007-8-1 call mystoreproduce();
5 2007-6-7 ...............

等等,也就是说,sql字段的内容就是一条完整的sql语句,如果楼主不想弄这个字段,也可以拆解开,然后用的时候再拼上也可以。

唉,如果 MySQL支持任务,也就没有这么麻烦了。


[解决办法]
数据格式:
id mytime execsql
1 2007-9-10 delete from t1 where ........;
2 2009-1-9 insert t2 ............;
3 2008-9-3 update ..............;
4 2007-8-1 call mystoreproduce();
5 2007-6-7 ...............

select id,execsql from table where mytime=now();

当然了,这个表的数据插入也得依据业务上的逻辑才可以,这点楼主比我更清除了。
要保证的是,插入的SQL语句要正确,否则,10天之后,调用该语句的时候,执行失败,可就....

如果是程序的话,就不说了,如果是从存储过程里面,需要用到游标,具体用法,楼主回头自己看看吧。

[解决办法]
afsad
[解决办法]
讨厌一大堆的!
[解决办法]
mark
[解决办法]
没完全看完。

现在各PHP论坛的缓存应用就是检测是否需要更新,如果需要更新就重新读取数据库,如果不需要就不读取数据。

可以把思想借鉴过来。
[解决办法]
create trigger 然后利用mysql的关键字NEW,这样行不?
[解决办法]
mysql就是不方便!
[解决办法]
mysql不会用,oracle可以设置作业来实现的

读书人网 >Mysql

热点推荐