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

自动更新(或插入)列字段的MySQL触发器,mysql,sql,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 m

我有一个可以运行的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
虽然将完整的
名称
拆分为
名字
中间名
,和
姓氏
效果很好,但我需要一种自动完成的方法;无法在每次添加
人员时进入并运行查询并手动更新表

我曾尝试以触发器的形式处理此查询,但不断出现错误,通常错误状态为“不允许从触发器返回结果集”


在插入前触发器中,使用限定符
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

是由于一个适用于
功能
触发器
的文件限制。(此限制也适用于从函数或触发器上下文调用的
过程

可能的@jzg.dev副本:我没有对此进行任何测试,我只是复制了SELECT语句中的表达式,并给出了插入前触发器的示例。(如果要保持这些列“同步”),您将需要考虑是否需要相应的<代码>,如果保持这些列“同步”是重要的。在<代码> >更新< /COD>触发器之前,列的当前值可通过符合<代码>旧> < /COD>来获得,例如“代码>如果(NEW.col OLD.col)
将新值与现有值进行比较。