2011-01-21 47 views
0

我需要创建一个触发器,它根据其他列值计算一个列值。数据库有点非正规化以获得更高的性能。 (规范化不是这个问题的问题)。MySql触发器不会计算

问题是我想设置computed_address值的值,如果我在其中放入一个常量,那就没关系。但似乎这些If子句不起作用,我只是看不到问题。

以下是触发代码。 非常感谢!

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

你的代码格式化需要一些爱。 – ijw 2011-01-21 16:49:54

回答

1

嘿, 只是回答。我必须首先初始化full_address变量。我刚才提出这个:

DECLARE full_address VARCHAR(255); 

但声明后,它需要的是初始化也:

SET full_address=""; 
1

在你的触发代码

END; 
$$ 

DELIMITER ; 

底部应该是

END$$ 

DELIMITER ; 
+0

它是以这种方式自动生成的。我认为问题在于检查空值。语法很好。 – gljivar 2011-01-22 12:26:26