2013-03-13 97 views
0

我有一些触发器将通话记录作为blob保存到数据库中。我想添加一些额外的功能,每次触发时都会执行,并有助于将数据库保留在一定的大小限制内:功能必须执行以下操作:while循环只使用mysql查询语言

必须计算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; 

THX。

+0

那么,什么happpens?你的触发器是否运行?它是否删除记录?你有错误吗?什么是错误? – Jocelyn 2013-03-13 16:48:35

回答

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;