MySql Trigger не будет вычислять

0

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

Проблема в том, что я хочу установить значение значения 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
    Ваше форматирование кода нуждается в любви.
Теги:
triggers

2 ответа

1
Лучший ответ

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

DECLARE full_address VARCHAR(255);

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

SET full_address="";
1

внизу кода запуска

END; 
$$

DELIMITER ;

должен быть

END$$

DELIMITER ;
  • 0
    Это было автоматически сгенерировано таким образом. Я думаю, что проблема в проверке на нулевые значения. Синтаксис хороший.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню