2013-03-13 5 views
0

J'ai un déclencheur pour enregistrer les enregistrements d'appels en tant que blob dans la base de données. Je veux ajouter une fonction supplémentaire qui s'exécutera à chaque fois avec le déclencheur et aidera à maintenir la base de données dans certaines limites de taille: function doit faire quelque chose comme ça:While boucle en utilisant uniquement le langage de requête mysql

Doit calculer la somme des fichiers blob. alors qu'il est plus grand que la valeur donnée, supprimez le plus ancien enregistrement de la table.

Je ne sais pas ce que je fais mal. S'il vous plaît jeter un oeil

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; 

Voici comment la base de données ressemble

-- ---------------------------- 
-- 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 à l'avance.

+0

Alors, quel happpens? Votre déclencheur fonctionne-t-il? Est-ce qu'il supprime les enregistrements? Avez-vous une erreur? Quelle est l'erreur? – Jocelyn

Répondre

0

Vous devez sélectionner la taille du fichier blob dans une variable en dehors de la boucle, puis mettre à jour la variable en relançant la sélection après chaque suppression.

Exemple de code en fonction de votre première tentative:

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; 
Questions connexes