MySQL触发器自动更新(或插入)列字段

时间:2014-09-10 22:54:58

标签: mysql sql

我有一个我可以运行的SQL查询,如下所示:

SELECT
   SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name,
   If(  length(name) - length(replace(name, ' ', ''))>1,  
       SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ,NULL) 
           as middle_name,
   SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 3), ' ', -1) AS last_name
FROM people

虽然将完整name分为first_namemiddle_namelast_name非常有用,但我需要一种自动完成此操作的方法;每次添加person时,都无法进入并运行查询并手动更新表格。

我尝试以触发器的形式使用此查询,但不断出现错误,通常错误状态为"Not allowed to return a result set from trigger"

任何帮助实现这项工作都会很棒

1 个答案:

答案 0 :(得分:0)

在BEFORE INSERT触发器中,使用限定符NEW.来引用分配给要插入的行的列的值。例如,NEW.col将引用为col列提供的值。

将值(或表达式)分配给NEW.col以替换为列col提供的值,而是插入分配的值。

完成类似于SELECT语句的触发器看起来像这样:

DELIMITER $$

CREATE TRIGGER mytrigger 
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN

   SET NEW.first_name  = SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.name, ' ', 1), ' ', -1);

   SET NEW.last_name   = SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.name, ' ', 3), ' ', -1);

   SET NEW.middle_name = IF(LENGTH( NEW.name) - LENGTH(REPLACE( NEW.name, ' ', ''))>1
       ,SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.name, ' ', 2), ' ', -1)
       ,NULL);

END$$

DELIMITER ;

您收到的错误:

Error: 1415 SQLSTATE: 0A000 (ER_SP_NO_RETSET)
Message: Not allowed to return a result set from a %s

由于文档限制适用于FUNCTIONTRIGGER。 (此限制也适用于从FUNCTION或TRIGGER的上下文中调用PROCEDURE。)