Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql触发器无法计算_Mysql_Sql_Triggers - Fatal编程技术网

MySql触发器无法计算

MySql触发器无法计算,mysql,sql,triggers,Mysql,Sql,Triggers,我需要创建一个触发器,根据其他列值计算一个列值。为了获得更高的性能,对数据库进行了一点非规范化。正常化不是这个问题的问题 问题是,我想设置计算出的地址值的值,如果我在其中放入一个常量就可以了。但这些If条款似乎不起作用,我就是看不出问题所在 下面是触发代码。 多谢各位 DELIMITER $$ USE `nth_poi_new_3`$$ DROP TRIGGER /*!50032 IF EXISTS */ `poi_address_creator`$$ CREATE /*!5001

我需要创建一个触发器,根据其他列值计算一个列值。为了获得更高的性能,对数据库进行了一点非规范化。正常化不是这个问题的问题

问题是,我想设置计算出的地址值的值,如果我在其中放入一个常量就可以了。但这些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 ;

在触发代码的底部

END; 
$$

DELIMITER ;
应该是

END$$

DELIMITER ;
哎,, 只是回答一下。我必须先初始化full_address变量。我刚做了这个:

DECLARE full_address VARCHAR(255);
但在声明之后,还需要进行初始化:

SET full_address="";

你的代码格式需要一些爱。它是自动生成的方式。我认为问题在于检查空值。语法很好。