2011-10-13 11 views
1

J'ai une table avec interface série (clé primaire), le texte, la dateTrigger quand tresshold est passé (MySQL)

chaque si souvent de s'insérer avec une rangée.

Le problème est que je ma table ne peut pas contenir moins de 80 lignes et pas plus de 100.

J'ai essayé d'écrire quelque chose, mais il semble que je fais des choses que je ne devrais pas faire:

CREATE TRIGGER checkForInsertBelow80 BEFORE INSERT ON log FOR EACH ROW 
BEGIN 
    IF (SELECT count(*) FROM log) >= 100 THEN 
    DELETE FROM log 
     WHERE serial in(SELECT serial from log order by serial ASC limit 10); 
    END IF  
END; | 

Mais d'abord, j'ai des erreurs de syntaxe, en second lieu, je devrais le faire après la dernière ligne. Quelqu'un peut-il m'aider à mettre la bonne approche et le bon code ensemble?

Répondre

1

1- Chaque instruction dans un proc stocké doit être terminée par ;.

2- Vous pouvez simplifier l'instruction delete.

3- Cependant, vous ne pouvez pas changer la même table à l'intérieur d'un déclencheur, vous pouvez seulement changer autres tables à l'intérieur d'un déclencheur.

Solution

Utilisez une table de BlackHole et insérer dans les détails, le BlackHole insère vos données dans la table de journal, ou supprime les entrées du journal si nécessaire.

CREATE TABLE bh_log (
    id integer null default null, 
    field1 varchar(255) not null, 
    other fields.... 
) ENGINE = BLACKHOLE; 

Ajoutez maintenant des triggers à la table blackhole si nécessaire.

Vous avez besoin d'un déclencheur INSERT, UPDATES et DELETS sont effectués sur la table de journal d'origine.

DELIMITER $$ 

CREATE TRIGGER ai_bh_log_each AFTER INSERT ON bh_log FOR EACH ROW 
BEGIN 
    DECLARE log_count INTEGER; 
    INSERT INTO log VALUES (NEW.id, NEW.field1, NEW......); 
    SELECT count(*) INTO log_count FROM log; 
    IF log_count > 100 THEN 
    //Delete the oldest entry 
    DELETE FROM log WHERE log.id IS NOT NULL ORDER BY id ASC LIMIT 1; 
    END IF; 
END $$ 

DELIMITER ; 

Parce que les feux de déclenchement pour chaque ligne que vous insérez, il vous suffit de supprimer 1 rang dans chaque déclencheur à 100% que le nombre total de lignes ne dépasse jamais un 100