求3个触发器的写法

qiuzhuo110 2010-11-29 10:31:03

-- Table structure for tcharge
-- ----------------------------
CREATE TABLE `tcharge` (
`tid` int(10) NOT NULL AUTO_INCREMENT,
`method` char(16) NOT NULL,
`from_tag` char(64) NOT NULL,
`to_tag` char(64) NOT NULL,
`callid` char(64) NOT NULL,
`sip_code` char(3) NOT NULL,
`sip_reason` char(32) NOT NULL,
`caller` char(64) NOT NULL,
`callee` char(64) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;

INSERT INTO `tcharge` VALUES ('53', 'INVITE', '417bff32', '29572476', 'N2QxMTA1ZGU3MDA0MmE0MTY2YzZkNzc4NjM1YWY1ODE.', '200', 'OK', 'sip:615102@192.168.1.78', 'sip:610186@192.168.1.78', '2010-08-07 09:26:08');
INSERT INTO `tcharge` VALUES ('54', 'BYE', '29572476', '417bff32', 'N2QxMTA1ZGU3MDA0MmE0MTY2YzZkNzc4NjM1YWY1ODE.', '200', 'OK', 'sip:610186@192.168.1.78', 'sip:615102@192.168.1.78', '2010-08-07 09:26:13');
这个表的数据是成对出现的,callid相同的为一对,method里的INVITE表示成对数据的第一个,BYE表示第二个。


-- Table structure for uinfoe
-- ----------------------------
CREATE TABLE `uinfoe` (
`ID` int(100) NOT NULL AUTO_INCREMENT,
`TLEAVINGS` int(50) NOT NULL DEFAULT '0',
`TENDTIME` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
`USTATE` varchar(100) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2010000007 DEFAULT CHARSET=utf8;

INSERT INTO `ctcm_en_userinfoes` VALUES ('2010000005', '20', '2011-01-24 21:42:29', '1');
INSERT INTO `ctcm_en_userinfoes` VALUES ('2010000006', '0', '2000-01-01 00:00:00', '0');


触发器1:tcharge表的成对数据全部插入后 method为BYE的那条数据的time减去INVITE那条数据的time,得到一个以秒为单位的值。然后uinfoe表的TLEAVINGS减去这个值。
触发器2:当uinfoe表的TLEAVINGS减少后,检查TLEAVINGS是否<=0,如果是,则USTATE更新为0,TLEAVINGS更新为0.如果否,则什么都不做。
触发器3:USTATE=1的数据 ,当TENDTIME里的时间<=当前时间时,USTATE更新为0
...全文
121 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-12-08
  • 打赏
  • 举报
回复
[Quote]那event怎么写[/Quote]

参考下贴。

另征集定时执行mysql数据库任务方案。
http://topic.csdn.net/u/20091020/22/c51bb709-6dbc-4fd1-b874-077714ed547e.html
qiuzhuo110 2010-12-08
  • 打赏
  • 举报
回复
那event怎么写
WWWWA 2010-12-06
  • 打赏
  • 举报
回复
每天定时触发:可用EVENT解决
qiuzhuo110 2010-12-06
  • 打赏
  • 举报
回复
表:
CREATE TABLE `uinfoe` (
`ID` int(100) NOT NULL AUTO_INCREMENT,
`TLEAVINGS` int(50) NOT NULL DEFAULT '0',
`TENDTIME` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
`USTATE` varchar(100) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2010000007 DEFAULT CHARSET=utf8;

表里数据
INSERT INTO `uinfoe` VALUES ('2010000005', '20', '2010-12-7 21:42:29', '1');
INSERT INTO `uinfoe` VALUES ('2010000006', '0', '2000-01-01 00:00:00', '0');

触发器触发条件:
TENDTIME<=now() 并且 USTATE='1'(或每天定时触发)

结果:
USTATE='0' TLEAVINGS=0
qiuzhuo110 2010-12-04
  • 打赏
  • 举报
回复
不是每次更新才判断下TENDTIME <=now()

而是当TENDTIME <=now()时触发。或每天的0点触发也可
ACMAIN_CHM 2010-12-04
  • 打赏
  • 举报
回复
[Quote]
触发器3
表uinfoe里所有USTATE=1的数据 ,当TENDTIME里的时间<=当前时间时,USTATE更新为0[/Quote]


触发器1,触发器2

一样,写出你的测试方法!
wwwwb 2010-12-03
  • 打赏
  • 举报
回复
1、直接用UPDATE 替换;
2、
CREATE TRIGGER tr_uinfoe_bi before updat ON uinfoe
FOR EACH ROW BEGIN
if new.TLEAVINGS<=0 or TENDTIME <=now() then
set new.USTATE=0;
set new.TLEAVINGS=0;
end if;
END;
qiuzhuo110 2010-12-02
  • 打赏
  • 举报
回复
红色部分update不小心丢个e
qiuzhuo110 2010-12-02
  • 打赏
  • 举报
回复
很抱歉,出差中,没有及时回帖
触发器一已经ok
触发器二我做了改动(红色部分)
CREATE TRIGGER tr_uinfoe_bi before updat ON uinfoe
FOR EACH ROW BEGIN
if new.TLEAVINGS<=0 then
set new.USTATE=0;
set new.TLEAVINGS=0;
end if;
END;
|

触发器三:由于前几天时间紧张没写触发器三要求,请谅解

触发器3
表uinfoe里所有USTATE=1的数据 ,当TENDTIME里的时间<=当前时间时,USTATE更新为0
WWWWA 2010-11-30
  • 打赏
  • 举报
回复
1
DELIMITER $$
DROP TRIGGER IF EXISTS `ee`.`ntc`$$
CREATE TRIGGER `ee`.`ntc` BEFORE INSERT
ON `ee`.`tcharge`
FOR EACH ROW BEGIN
UPDATE uinfoe a INNER JOIN
(SELECT callid,SUM(TIMEDIFF(`time`,new.`time`)) AS aa FROM tcharge GROUP BY callid) b
ON a.id=new.callid
SET a.`TLEAVINGS`=`TLEAVINGS` +COALESCE(aa,0);
END$$

DELIMITER ;

2
DELIMITER $$
DROP TRIGGER IF EXISTS `ee`.`ntc1`$$
CREATE TRIGGER `ee`.`ntc1` BEFORE UPDATE
ON `ee`.`uinfoe`
FOR EACH ROW BEGIN
IF new.TLEAVINGS<=0 THEN
SET new.TLEAVINGS=0;
SET new.USTATE=0;
END IF;
END$$

DELIMITER ;
qiuzhuo110 2010-11-30
  • 打赏
  • 举报
回复
触发器1:tcharge表的成对数据全部插入后 method为BYE的那条数据的time减去INVITE那条数据的time,得到一个以秒为单位的值。然后uinfoe表的TLEAVINGS减去这个值。


uinfoe表里的数据:
INSERT INTO `uinfoe` VALUES ('2010000005', '20', '2011-01-24 21:42:29', '1');
INSERT INTO `uinfoe` VALUES ('2010000006', '0', '2000-01-01 00:00:00', '0');

执行
INSERT INTO `tcharge` VALUES ('53', 'INVITE', '417bff32', '29572476', '2010000005', '200', 'OK', 'sip:615102@192.168.1.78', 'sip:610186@192.168.1.78', '2010-08-07 09:26:08');
INSERT INTO `tcharge` VALUES ('54', 'BYE', '29572476', '417bff32', '2010000005', '200', 'OK', 'sip:610186@192.168.1.78', 'sip:615102@192.168.1.78', '2010-08-07 09:26:13');

需要达到的结果为
uinfoe 表里id='2010000005'的TLEAVINGS数据减少为15;

触发器2:当uinfoe表的TLEAVINGS减少后,检查TLEAVINGS是否<=0,如果是,则USTATE更新为0,TLEAVINGS更新为0.如果否,则什么都不做。
uinfoe 表里的TLEAVINGS数据是不断减少的,当减少<=0时,则
update UINFOE set USTATE='0' , TLEAVINGS='0'

本人是个菜鸟,如发帖不规范或描述不清楚,还请前辈多多指教
WWWWA 2010-11-30
  • 打赏
  • 举报
回复
要求结果贴出来看看
ACMAIN_CHM 2010-11-30
  • 打赏
  • 举报
回复
[Quote]触发器2:当uinfoe表的TLEAVINGS减少后,检查TLEAVINGS是否<=0,如果是,则USTATE更新为0,TLEAVINGS更新为0.如果否,则什么都不做。
uinfoe 表里的TLEAVINGS数据是不断减少的,当减少<=0时,则
update UINFOE set USTATE='0' , TLEAVINGS='0'[/Quote]
delimiter |

CREATE TRIGGER tr_uinfoe_bi before INSERT ON tcharge
FOR EACH ROW BEGIN
if new.TLEAVINGS<=0 then
set new.USTATE=0;
set new.TLEAVINGS=0;
end if;
END;
|

delimiter ;
ACMAIN_CHM 2010-11-30
  • 打赏
  • 举报
回复
[Quote]触发器1:tcharge表的成对数据全部插入后 method为BYE的那条数据的time减去INVITE那条数据的time,得到一个以秒为单位的值。然后uinfoe表的TLEAVINGS减去这个值。[/Quote]


delimiter |

CREATE TRIGGER tr_tcharge_ai_1 after INSERT ON tcharge
FOR EACH ROW BEGIN
declare v_INVITE_time datetime;

if NEW.method = 'BYE' THEN
select time into v_INVITE_time
from tcharge
where callid=NEW.callid
and method='INVITE'
order by tid desc limit 1;

update uinfoe
set TLEAVINGS=TLEAVINGS-(UNIX_TIMESTAMP(new.time)-UNIX_TIMESTAMP(v_INVITE_time))
where ID=new.callid;
END IF;
END;
|

delimiter ;


mysql>
mysql> select * from uinfoe;
+------------+-----------+---------------------+--------+
| ID | TLEAVINGS | TENDTIME | USTATE |
+------------+-----------+---------------------+--------+
| 2010000005 | 20 | 2011-01-24 21:42:29 | 1 |
| 2010000006 | 0 | 2000-01-01 00:00:00 | 0 |
+------------+-----------+---------------------+--------+
2 rows in set (0.06 sec)

mysql> select * from tcharge;
Empty set (0.02 sec)

mysql> delimiter |
mysql>
mysql> CREATE TRIGGER tr_tcharge_ai_1 after INSERT ON tcharge
-> FOR EACH ROW BEGIN
-> declare v_INVITE_time datetime;
->
-> if NEW.method = 'BYE' THEN
-> select time into v_INVITE_time
-> from tcharge
-> where callid=NEW.callid
-> and method='INVITE'
-> order by tid desc limit 1;
->
-> update uinfoe
-> set TLEAVINGS=TLEAVINGS-(UNIX_TIMESTAMP(new.time)-UNIX_T
IMESTAMP(v_INVITE_time))
-> where ID=new.callid;
-> END IF;
-> END;
-> |
Query OK, 0 rows affected (0.03 sec)

mysql>
mysql> delimiter ;
mysql> select * from uinfoe;
+------------+-----------+---------------------+--------+
| ID | TLEAVINGS | TENDTIME | USTATE |
+------------+-----------+---------------------+--------+
| 2010000005 | 20 | 2011-01-24 21:42:29 | 1 |
| 2010000006 | 0 | 2000-01-01 00:00:00 | 0 |
+------------+-----------+---------------------+--------+
2 rows in set (0.00 sec)

mysql> INSERT INTO `tcharge` VALUES ('53', 'INVITE', '417bff32', '29572476', '20
10000005', '200', 'OK', 'sip:615102@192.168.1.78', 'sip:610186@192.168.1.78', '2
010-08-07 09:26:08');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `tcharge` VALUES ('54', 'BYE', '29572476', '417bff32', '20100
00005', '200', 'OK', 'sip:610186@192.168.1.78', 'sip:615102@192.168.1.78', '2010
-08-07 09:26:13');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tcharge;
+-----+--------+----------+----------+------------+----------+------------+-------------------------+-------------------------+---------------------+
| tid | method | from_tag | to_tag | callid | sip_code | sip_reason | caller | callee | time |
+-----+--------+----------+----------+------------+----------+------------+-------------------------+-------------------------+---------------------+
| 53 | INVITE | 417bff32 | 29572476 | 2010000005 | 200 | OK | sip:615102@192.168.1.78 | sip:610186@192.168.1.78 | 2010-08-07 09:26:08 |
| 54 | BYE | 29572476 | 417bff32 | 2010000005 | 200 | OK | sip:610186@192.168.1.78 | sip:615102@192.168.1.78 | 2010-08-07 09:26:13 |
+-----+--------+----------+----------+------------+----------+------------+-------------------------+-------------------------+---------------------+
2 rows in set (0.00 sec)

mysql> select * from uinfoe;
+------------+-----------+---------------------+--------+
| ID | TLEAVINGS | TENDTIME | USTATE |
+------------+-----------+---------------------+--------+
| 2010000005 | 15 | 2011-01-24 21:42:29 | 1 |
| 2010000006 | 0 | 2000-01-01 00:00:00 | 0 |
+------------+-----------+---------------------+--------+
2 rows in set (0.00 sec)

mysql>
ACMAIN_CHM 2010-11-29
  • 打赏
  • 举报
回复
[Quote]触发器1:tcharge表的成对数据全部插入后 method为BYE的那条数据的time减去INVITE那条数据的time,得到一个以秒为单位的值。然后uinfoe表的TLEAVINGS减去这个值。
触发器2:当uinfoe表的TLEAVINGS减少后,检查TLEAVINGS是否<=0,如果是,则USTATE更新为0,TLEAVINGS更新为0.如果否,则什么都不做。
触发器3:USTATE=1的数据 ,当TENDTIME里的时间<=当前时间时,USTATE更新为0[/Quote]

举列说明,或者告诉别人如何测试。
qiuzhuo110 2010-11-29
  • 打赏
  • 举报
回复
这个我在数据库中拿出后进行了修改,漏改一处
CREATE TABLE `tcharge` (
`tid` int(10) NOT NULL AUTO_INCREMENT,
`method` char(16) NOT NULL,
`from_tag` char(64) NOT NULL,
`to_tag` char(64) NOT NULL,
`callid` char(64) NOT NULL,
`sip_code` char(3) NOT NULL,
`sip_reason` char(32) NOT NULL,
`caller` char(64) NOT NULL,
`callee` char(64) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;
ACMAIN_CHM 2010-11-29
  • 打赏
  • 举报
回复
[Quote]CREATE TABLE `tcharge` (
`tid` int(10) NOT NULL AUTO_INCREMENT,
`method` char(16) NOT NULL,
`from_tag` char(64) NOT NULL,
`to_tag` char(64) NOT NULL,
`callid` char(64) NOT NULL,
`sip_code` char(3) NOT NULL,
`sip_reason` char(32) NOT NULL,
`caller` char(64) NOT NULL,
`callee` char(64) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;[/Quote]楼主能确认你提供的这个语句能正确执行吗? 提供测试用例的进修请先自己试一下,某则根据错误的东西做出来的东西没办法保证是你所期望的结果。这样反而是浪费了双方时间。

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧