2011-01-21 3 views
0

Мне нужно создать триггер, который вычисляет одно значение столбца на основе других значений столбца. База данных немного денормализована для повышения производительности. (Нормализация не является вопросом этого вопроса).MySql Trigger не будет вычислять

Проблема в том, что я хочу установить значение значения 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

ответ

1

Эй, просто ответить. Сначала мне пришлось инициализировать переменную full_address. Я только что сделал это:

DECLARE full_address VARCHAR(255); 

Но после объявления ему необходимо быть инициализации также:

SET full_address=""; 
1

в нижней части вашего кода триггера

END; 
$$ 

DELIMITER ; 

должен быть

END$$ 

DELIMITER ; 
+0

Автоматически сгенерирован таким образом. Я думаю, что проблема заключается в проверке нулей. Синтаксис хорош. – gljivar

Смежные вопросы