while循环只使用mysql查询语言

时间:2013-03-13 16:43:57

标签: mysql function triggers while-loop

我有一些触发器将呼叫记录保存为blob到数据库中。我想添加一些额外的函数,每次使用触发器执行,并将有助于保持数据库在某些大小限制:函数必须做类似的事情:

必须计算blob文件的总和。虽然它比给定值大,但从表中删除最旧的记录。

我不知道我做错了什么。请看一下

WHILE ((select sum(OCTET_LENGTH(recordfile))/1000000 from callrecords)>0,1) 
DO
BEGIN
DELETE FROM callrecords ORDER BY id ASC LIMIT 1;
END;  
END WHILE;

以下是数据库的外观

-- ----------------------------
-- Table structure for `callrecords`
-- ----------------------------
CREATE TABLE `callrecords` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `uid` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
  `callerid` int(11) NOT NULL,
  `extension` int(11) NOT NULL,
  `calldate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `recordfile` longblob,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=350 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该将blob文件大小选择到循环外的变量中,然后在每次删除后重新运行select来更新变量。

基于您最初尝试的代码示例:

declare v_size int;
...
-- initialize the variable
select sum(OCTET_LENGTH(recordfile)) 
into v_size
from callrecords;

while (v_size > 1000000)
do
  DELETE FROM callrecords ORDER BY id ASC LIMIT 1;

  -- update the variable
  select sum(OCTET_LENGTH(recordfile))
  into v_size
  from callrecords;

end while;