2009-04-01 4 views
0

Lors de l'insertion d'une nouvelle ligne dans une table T, je voudrais vérifier si la table est supérieure à un certain seuil, et si tel est le cas supprimer le plus ancien (en créant une sorte de FIFO à la fin).Déclencheur MySQL: est-il possible de supprimer des lignes si la table devient trop grande?

Je pensais que je pourrais simplement faire un déclencheur, mais apparemment MySQL ne permet pas la modification de la table sur laquelle nous insérons en fait:

Code: 1442 Msg: Can't update table 'amoreAgentTST01' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

Voici le déclencheur j'ai essayé:

Delimiter $$ 
CREATE TRIGGER test 
     AFTER INSERT ON amoreAgentTST01 
     FOR EACH ROW 
BEGIN 
    DECLARE table_size INTEGER; 
    DECLARE new_row_size INTEGER; 
    DECLARE threshold INTEGER; 
    DECLARE max_update_time TIMESTAMP; 

SELECT SUM(OCTET_LENGTH(data)) INTO table_size FROM amoreAgentTST01; 
SELECT OCTET_LENGTH(NEW.data) INTO new_row_size; 
SELECT 500000 INTO threshold; 
select max(updatetime) INTO max_update_time from amoreAgentTST01; 

IF (table_size+new_row_size) > threshold THEN 
    DELETE FROM amoreAgentTST01 WHERE max_update_time = updatetime; -- and check if not current 
END IF; 
END$$ 
delimiter ; 

Avez-vous une idée sur la façon de le faire dans la base de données?

Ou il est clairement quelque chose à faire dans mon programme?

Répondre

4

Idéalement, vous devriez avoir une stratégie d'archivage dédiée dans un processus distinct qui fonctionne en dehors des heures de pointe.

Vous pouvez mettre en œuvre ce soit comme une procédure stockée prévue (beurk) ou un thread de travail de fond supplémentaire dans votre serveur d'applications ou d'un service d'application totalement séparée. Ce serait un bon endroit pour mettre d'autres emplois ménagers réguliers.

Cela a quelques avantages. En plus d'éviter le problème de déclenchement que vous voyez, vous devriez considérer les implications de performance de n'importe quoi se produisant dans un déclencheur. Si vous faites beaucoup d'insertions, ce déclencheur fera ce travail et efficacement la moitié des performances, sans parler de la contention de verrous qui surviendra lorsque d'autres processus essaieront d'accéder à la même table.

Un processus distinct effectuant un travail de maintenance minimise les conflits de verrouillage et permet de réaliser le travail en tant qu'opération de masse haute performance dans une transaction.

Une dernière chose - vous devriez peut-être envisager d'archiver des documents à une autre table ou base de données, plutôt que de les supprimer.

Questions connexes