2011-01-21 7 views
0

Je dois créer un déclencheur qui calcule une valeur de colonne en fonction d'autres valeurs de colonne. Une base de données est un peu dénormalisée pour obtenir de meilleures performances. (La normalisation n'est pas un problème de cette question).MySql Trigger ne calcule pas

Le problème est que je veux définir la valeur de l'adresse calculée et que c'est correct si je lui mets une constante. Mais il semble que ces clauses If ne fonctionnent pas et je ne vois tout simplement pas le problème.

Vous trouverez ci-dessous le code du déclencheur. Merci beaucoup!

DELIMITER $$ 

USE `nth_poi_new_3`$$ 

DROP TRIGGER /*!50032 IF EXISTS */ `poi_address_creator`$$ 

CREATE 
    /*!50017 DEFINER = 'root'@'localhost' */ 
    TRIGGER `poi_address_creator` BEFORE INSERT ON `poi` 
    FOR EACH ROW BEGIN 
    DECLARE full_address VARCHAR(255); 
    DECLARE country_string VARCHAR(100); 
    DECLARE region_string VARCHAR(100); 
    DECLARE town_string VARCHAR(100); 
    DECLARE address_string VARCHAR(100); 

    IF NEW.address <> '' THEN 
     SET full_address = CONCAT(NEW.address, ","); 

    END IF; 
    IF NEW.town_name IS NOT NULL THEN 
     SET full_address = CONCAT(full_address, NEW.town_name, ","); 
    ELSEIF NEW.town_id IS NOT NULL THEN 
     SELECT NAME INTO town_string FROM town WHERE town.town_id = NEW.town_id LIMIT 1; 
     SET full_address = CONCAT(full_address, town_string, ","); 
    END IF; 

    IF NEW.region_name IS NOT NULL THEN 
     SET full_address = CONCAT(full_address, NEW.region_name, ","); 
    ELSEIF NEW.region_id IS NOT NULL THEN 
     SELECT NAME INTO region_string FROM region WHERE region.region_id = NEW.region_id LIMIT 1; 
     SET full_address = CONCAT(full_address, region_string, ","); 
    END IF; 

    IF NEW.country_name IS NOT NULL THEN 
     SET full_address = CONCAT(full_address, NEW.country_name, ","); 
    ELSEIF NEW.country_id IS NOT NULL THEN 
     SELECT NAME INTO country_string FROM country WHERE country.country_id = NEW.country_id LIMIT 1; 
     SET full_address = CONCAT(full_address, country_string, ","); 
    END IF; 

    SET NEW.computed_address = full_address; 

    END; 
$$ 

DELIMITER ; 
+0

Votre mise en forme a besoin d'amour de code. – ijw

Répondre

1

Hey, juste pour répondre. J'ai dû initialiser la variable full_address en premier. Je viens de faire ceci:

DECLARE full_address VARCHAR(255); 

Mais après la déclaration qu'il devait être aussi l'initialisation:

SET full_address=""; 
1

au bas de votre code de déclenchement

END; 
$$ 

DELIMITER ; 

devrait être

END$$ 

DELIMITER ; 
+0

Il a été généré automatiquement de cette façon. Je pense que le problème est de vérifier les nulls. La syntaxe est bonne. – gljivar